擅长:python、mysql、java
<p>你似乎认为你在试图避免一个“简单”的种族状况,比如</p>
<pre><code>... = zmq_recv(fd);
do_something();
zmq_send(fd, answer);
/* Let's hope a new request does not arrive just now, please close it quickly! */
zmq_close(fd);
</code></pre>
<p>但我认为问题是公平排队(循环)使事情变得更加困难:您甚至可能已经在您的工人上有几个排队的请求。如果轮到发送者接收新请求,则发送者在发送新请求之前不会等待工作者空闲,因此在您调用<code>zmq_send</code>时,其他请求可能已经在等待。</p>
<p>实际上,看起来您可能选择了错误的数据方向。与其让请求池向工作人员发送请求(即使您不希望接收新请求),不如让工作人员从请求队列中获取新请求,处理它,然后发送答案。</p>
<p>当然,这意味着使用<code>XREP</code>/<code>XREQ</code>,但我认为这是值得的。</p>
<p><strong>编辑:</strong>我写了<a href="https://github.com/samueltardieu/zmq-broker" rel="noreferrer">some code</a>实现<a href="http://www.rfc1149.net/blog/2010/12/08/responsible-workers-with-0mq/" rel="noreferrer">the other direction</a>来解释我的意思。</p>