我这周开始使用 ZeroMQ,当使用请求响应模式时,我不确定如何让工作人员安全地“挂断”并关闭他的套接字,而不会丢失消息并导致发送该消息的客户永远不会收到回复。想象一个用 Python 编写的工人看起来像这样:
import zmq
c = zmq.Context()
s = c.socket(zmq.REP)
s.connect('tcp://127.0.0.1:9999')
while i in range(8):
s.recv()
s.send('reply')
s.close()
我一直在做实验,发现提出公平排队请求127.0.0.1:9999
的套接字类型的客户可能会不幸让公平排队算法在工人完成最后一次但在它运行之前立即zmq.REQ
选择上述工人send()
下面的close()
方法。在这种情况下,似乎请求被工作进程中的ØMQ堆栈接收和缓冲,然后当close()
抛出与套接字相关的所有内容时,请求就会丢失。
工作人员如何“安全地”分离——有什么方法可以发出“我不再需要消息”的信号,然后(a)循环在信号传输期间到达的任何最终消息,(b)生成它们的回复,然后(c)close()
在保证没有消息被丢弃的情况下执行?
编辑:我想我想进入的原始状态是“半关闭”状态,在这种状态下无法接收到进一步的请求——并且发件人会知道——但返回路径仍然打开,以便我可以检查我的最后一条消息的传入缓冲区,如果缓冲区中有一条消息,则对其进行响应。
编辑:为了回答一个好问题,更正了描述以使等待消息的数量成为复数,因为可能有许多连接在等待回复。