擅长:python、mysql、java
<p>之所以会发生这种情况,是因为每个进程在调用map开始时都有一个预定义的工作量,这取决于<code>chunksize</code>。我们可以通过查看<a href="http://hg.python.org/cpython/file/1c54def5947c/Lib/multiprocessing/pool.py#l305">pool.map</a>的源代码来计算默认的<code>chunksize</code></p>
<pre><code>chunksize, extra = divmod(len(iterable), len(self._pool) * 4)
if extra:
chunksize += 1
</code></pre>
<p>因此,对于20的范围,以及4个进程,我们将得到2的<code>chunksize</code>。</p>
<p>如果我们修改您的代码以反映这一点,我们将得到与您现在得到的结果相似的结果:</p>
<p><code>proc_pool.map(SomeFunc, range(num_calls), chunksize=2)</code></p>
<p>这将产生输出:</p>
<p><code>0 2 6 4 1 7 5 3 8 10 12 14 9 13 15 11 16 18 17 19</code></p>
<p>现在,设置<code>chunksize=1</code>将确保池中的每个进程一次只分配一个任务。</p>
<p><code>proc_pool.map(SomeFunc, range(num_calls), chunksize=1)</code></p>
<p>与未指定块大小时相比,这应确保相当好的数字顺序。例如,chunksize为1会产生输出:</p>
<p><code>0 1 2 3 4 5 6 7 9 10 8 11 13 12 15 14 16 17 19 18</code></p>