首页 > 解决方案 > python中使用函数multiprocessing.Pool的奇怪结果?

问题描述

这是代码:

一:

import multiprocessing
import datetime
import time
a = [i for i in range(100)]
res1 = []
def jia(a,b,c):
    time.sleep(0.1)
    return a + b + c
res1_time_start = datetime.datetime.now()
p = multiprocessing.Pool(4)
res1 = [p.apply_async(jia,(i,1,1)) for i in a]
res1 = [i.get() for i in res1]
res1_time_end = datetime.datetime.now()
print((res1_time_end - res1_time_start).seconds)

另一个:

import multiprocessing
import datetime
import time
a = [i for i in range(100)]
res1 = []
def jia(a,b,c):
    time.sleep(0.1)
    return a + b + c
res1_time_start = datetime.datetime.now()
p = multiprocessing.Pool(4)
for i in a:
    res1.append(p.apply_async(jia,(i,1,1)).get())
res1_time_end = datetime.datetime.now()
print((res1_time_end - res1_time_start).seconds)

奇怪的结果是前者花费了 2.5s,而后者花费了 10s。为什么? list.append Blocks 处理吗?

标签: pythonpython-3.xmultiprocessingpython-3.6

解决方案


不,append()不会阻塞,但.get()会阻塞。这就是阻塞的目的。.get()

res1 = [p.apply_async(jia,(i,1,1)) for i in a]
res1 = [i.get() for i in res1]

在第二行调用any之前, 所有工作都由第一行提供给池。.get()但在

for i in a:
    res1.append(p.apply_async(jia,(i,1,1)).get())

.get()允许循环继续甚至开始下一个工作之前,等待单个工作完成。您已将工作序列化 - 没有任何有用的并行发生。


推荐阅读