在Python 3中使用Pool.map()和range()运行代码时的奇怪行为

时间:2015-04-24 06:12:35

标签: python python-3.x python-multiprocessing

使用multiprocessingrange()生成器时,我遇到了一些奇怪的行为,我无法弄清楚发生了什么。

以下是代码:

from multiprocessing import Pool
import time

def worker_thread(param):
    time.sleep(1)
    print(param, end=' ', flush=True)

p = Pool(1)
inp = list(range(0, 100))

p.map(worker_thread, inp)

执行此代码时(只有1个线程),输出符合预期:

0 1 2 3 4 5 6 7 ...

但是,当我将线程数提高到2时,输出变得无法解释:

0 13 1 14 2 15 3 16 4 17 ...

依此类推,此行为会出现更高的线程数。由于list(range(0,100))按升序生成0到99之间的数字列表,为什么map()不按照它的顺序扫描列表?

1 个答案:

答案 0 :(得分:4)

您看到打印的项目以意外的顺序出现,因为multiprocessing.Pool.map将输入划分为每个工作进程处理的块。这is documented(斜体添加以强调重要位):

  

map(func, iterable[, chunksize])

     

map()内置函数的并行等价物(它只支持一个可迭代的参数)。它会阻塞,直到结果准备就绪。

     

此方法将迭代器切换为多个块,并将其作为单独的任务提交给进程池。可以通过将chunksize设置为正整数来指定这些块的(近似)大小。

在您显示的示例输出中,看起来Python选择了chunksize为13,因为您没有指定自己的大小。尝试将1作为chunksize传递,我认为您将获得预期的输出(可能以降低性能为代价)。