擅长:python、mysql、java
<p>编辑-你改变了一些东西,让我试着解释一下。在</p>
<p>输入队列中的每一条消息都会导致monty_hall_sim函数被调用,并向输出队列发送num_trial消息。在</p>
<p>所以你最初的实现是正确的——得到20条输出消息,发送5条输入消息。在</p>
<p>但是,您的功能有点错误。在</p>
<pre><code>for trial in xrange(num_trial):
res = MontyHallGame().play_game(player)
yield res
</code></pre>
<P>这将把函数变成一个发生器,在每个下一个调用中提供一个新的值——太好了!问题就在这里</p>
^{pr2}$
<p>在这里,在循环的每一次传递中,都会创建一个包含新消息的新生成器。旧的被扔掉了。因此,在这里,每个输入消息只向队列中添加一个输出消息,然后将其丢弃并获取另一个输出消息。正确的写法是-</p>
<pre><code>while True:
try:
f, args = in_queue.get(timeout=1)
ret = f(*args)
for result in ret:
out_queue.put(ret.next())
except:
break
</code></pre>
<p>这样做将继续从生成器生成输出消息,直到它完成(在本例中生成4条消息之后)</p>