zeromq:如何防止无限等待?
我刚开始使用ZMQ。我正在设计一个工作流程为:
- 5555(具有随机PULL地址)的多个客户端之一向服务器推送请求
- 服务器永远等待客户端推送。当一个请求到达时,将为该特定请求生成一个工作进程。是的,工作进程可以同时存在。
- 该流程完成任务后,会将结果推送给客户端。
我认为PUSH / PULL体系结构适合于此。请对此进行 指正 。
但是,如何处理这些情况?
- 服务器无法响应时,client_receiver.recv()将无限期等待。
- 客户端可以发送请求,但是此请求将立即失败,因此工作进程将永远停留在server_sender.send()处。
那么如何在PUSH / PULL模型中设置 超时 等内容?
编辑 :感谢user938949的建议,我得到了一个 有效的答案 ,我在后人中分享。
-
如果使用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)。