<p>本周我开始使用ZeroMQ,当使用请求-响应模式时,我不确定如何让一个工作人员安全地“挂断”并关闭其套接字,而不可能丢弃消息,并导致发送该消息的客户永远得不到响应。想象一下一个用Python编写的工人,他看起来像这样:</p>
<pre><code>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()
</code></pre>
<p>我一直在做实验,发现在套接字类型<code>zmq.REQ</code>的<code>127.0.0.1:9999</code>中,发出公平队列请求的客户可能会不幸地让公平队列算法在工作人员完成最后一个<code>send()</code>之后,但在运行下面的<code>close()</code>方法之前选择上面的工作人员。在这种情况下,请求似乎由工作进程中的MQ堆栈接收和缓冲,然后当<code>close()</code>抛出与套接字相关的所有内容时,请求将丢失。</p>
<p>一个工人如何才能“安全地”分离——有没有任何方法可以发出“我不再需要消息”的信号,然后(a)在信号传输过程中循环任何到达的最终消息,(b)生成它们的回复,然后(c)在保证没有消息被丢弃的情况下执行<code>close()</code>?</p>
<p><strong>编辑:</strong>我想输入的原始状态是“半关闭”状态,如果不能接收到更多的请求(发送方也知道),但是返回路径仍然打开,这样我就可以检查传入缓冲区中最后到达的一条消息,如果缓冲区中有一条消息,就可以对其进行响应。</p>
<p><strong>编辑:</strong>针对一个好问题,更正了说明以使等待消息的数量多元化,因为可能有许多连接在等待答复。</p>