擅长:python、mysql、java
<p><a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.close" rel="nofollow">^{<cd1>}</a>不太可能花那么长时间。{这只是因为}</p>
<pre><code>def close(self):
debug('closing pool')
if self._state == RUN:
self._state = CLOSE
self._worker_handler._state = CLOSE
</code></pre>
<p>所以所有发生的就是一些状态变量改变了。这对该方法的运行时没有可测量的影响,也不会导致它稍后返回。您可以假设<code>close</code>立即返回<em>。在</p>
<p>现在,更有可能的是你的<code>pool.join()</code>线路是延迟的“罪魁祸首”。但它只是在做<a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.join" rel="nofollow">its job</a>:</p>
<blockquote>
<p>Wait for the worker processes to exit.</p>
</blockquote>
<p>它实际上对池中的每个进程调用<a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.join" rel="nofollow">^{<cd5>}</a>。如果你加入了一个进程或线程,你就在积极地等待它完成工作并终止。在</p>
<p>所以在您的例子中,有20个进程在运行,它们向一个集合添加了一百万个元素。那需要一段时间。为了使您的主进程不会过早退出(顺便说一句,会导致子进程死亡),您正在等待工作进程完成其工作;加入它们。因此,你所经历的可能是你所做的工作量应该发生的事情。在</p>
<p>附带说明:如果你在你的工作函数中做了大量的CPU工作,你不应该产生比你的CPU可用的硬件线程更多的进程,因为你只会从管理和交换进程中引入额外的开销。例如,对于消费者核心i7,这个数字应该是8。在</p>