zeromq:如何防止无限等待?

发布于 2021-01-29 17:07:44

我刚开始使用ZMQ。我正在设计一个工作流程为:

  1. 5555(具有随机PULL地址)的多个客户端之一向服务器推送请求
  2. 服务器永远等待客户端推送。当一个请求到达时,将为该特定请求生成一个工作进程。是的,工作进程可以同时存在。
  3. 该流程完成任务后,会将结果推送给客户端。

我认为PUSH / PULL体系结构适合于此。请对此进行 指正


但是,如何处理这些情况?

  1. 服务器无法响应时,client_receiver.recv()将无限期等待。
  2. 客户端可以发送请求,但是此请求将立即失败,因此工作进程将永远停留在server_sender.send()处。

那么如何在PUSH / PULL模型中设置 超时 等内容?


编辑 :感谢user938949的建议,我得到了一个 有效的答案 ,我在后人中分享。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果使用zeromq> = 3.0,则可以设置RCVTIMEO套接字选项:

    client_receiver.RCVTIMEO = 1000 # in milliseconds
    

    但通常,您可以使用轮询器:

    poller = zmq.Poller()
    poller.register(client_receiver, zmq.POLLIN) # POLLIN for recv, POLLOUT for send
    

    poller.poll()超时:

    evts = poller.poll(1000) # wait *up to* one second for a message to arrive.
    

    evts 如果什么也收不到,将是一个空列表。

    您可以使用轮询zmq.POLLOUT,以检查发送是否成功。

    或者,要处理可能失败的对等方,请执行以下操作:

    worker.send(msg, zmq.NOBLOCK)
    

    可能就足够了,它将始终立即返回-如果发送无法完成,则引发ZMQError(zmq.EAGAIN)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看