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

mit*_*nia 0 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)
Run Code Online (Sandbox Code Playgroud)

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

0 1 2 3 4 5 6 7 ...
Run Code Online (Sandbox Code Playgroud)

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

0 13 1 14 2 15 3 16 4 17 ...
Run Code Online (Sandbox Code Playgroud)

依此类推,这种行为出现在线程数较高的情况下。既然list(range(0,100))按升序生成了从 0 到 99 的数字列表,为什么不map()按它所在的顺序扫描列表?

Blc*_*ght 5

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

map(func, iterable[, chunksize])

map() 内置函数的并行等效项(尽管它仅支持一个可迭代参数)。它阻塞直到结果准备好。

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

在您显示的示例输出中,看起来 Python 选择了chunksize13,因为您没有指定自己的大小。尝试通过1作为chunksize,我想你会得到你所期望的输出(可能在较慢的性能为代价,虽然)。