使用multiprocessing
和range()
生成器时,我遇到了一些奇怪的行为,我无法弄清楚发生了什么。
以下是代码:
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()
不按照它的顺序扫描列表?
答案 0 :(得分:4)
您看到打印的项目以意外的顺序出现,因为multiprocessing.Pool.map
将输入划分为每个工作进程处理的块。这is documented(斜体添加以强调重要位):
map(func, iterable[, chunksize])
map()内置函数的并行等价物(它只支持一个可迭代的参数)。它会阻塞,直到结果准备就绪。
此方法将迭代器切换为多个块,并将其作为单独的任务提交给进程池。可以通过将chunksize设置为正整数来指定这些块的(近似)大小。
在您显示的示例输出中,看起来Python选择了chunksize
为13,因为您没有指定自己的大小。尝试将1
作为chunksize
传递,我认为您将获得预期的输出(可能以降低性能为代价)。