<p>不幸的是,在Python2.x中并没有一个很好的解决方案。我知道最好的解决方法是使用<code>pool.map_async(...).get(timeout=<large number>)</code>,而不是<code>pool.map</code>。问题是<code>pool.map</code>调用<code>threading.Condition.wait()</code>,这由于某种原因不能被Python 2.x中的Ctrl+C中断(它在Python 3中工作)。当您使用<code>map_async()</code>时,它调用<code>threading.Condition.wait(timeout=<large number>)</code>,最后会执行一个繁忙的等待循环,这个循环可以被Ctrl+C中断</p>
<p>你自己试试吧:</p>
<pre><code>c = threading.Condition()
try:
c.acquire()
c.wait() # You won't be able to interrupt this
except KeyboardInterrupt:
print("Caught it")
c = threading.Condition()
try:
c.acquire()
c.wait(timeout=100) # You CAN interrupt this
except KeyboardInterrupt:
print("Caught it")
</code></pre>
<p>因此,要使您的<code>map</code>调用可中断,请执行以下操作:</p>
<pre><code>if __name__ == "__main__":
p = multiprocessing.Pool()
try:
p.map_async(func, iterable).get(timeout=10000000)
except KeyboardInterrupt:
print("Caught it")
# Optionally try to gracefully shut down the worker processes here.
p.close()
# DON'T join the pool. You'll end up hanging.
</code></pre>
<p>另外请注意,正如phihag所指出的,这个问题在Python 3.4中得到了修复(可能在3.x中更早的版本)。</p>