使用函数multiprocessing.Pool的python中的奇怪结果?

Dac*_*hao 1 python multiprocessing python-3.x python-3.6

这是代码:

一:

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)
Run Code Online (Sandbox Code Playgroud)

另一个:

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)
Run Code Online (Sandbox Code Playgroud)

奇怪的结果是,前者花费2.5s但后者花费10s.为什么?list.append阻止进程?

Tim*_*ers 5

不,append()不会阻止,但.get()确实如此.它的宗旨.get()封锁.在

res1 = [p.apply_async(jia,(i,1,1)) for i in a]
res1 = [i.get() for i in res1]
Run Code Online (Sandbox Code Playgroud)

所有的工作都是由第一行之前给池中任何 .get()由第二行调用.但在

for i in a:
    res1.append(p.apply_async(jia,(i,1,1)).get())
Run Code Online (Sandbox Code Playgroud)

.get()允许循环继续开始下一项工作之前等待单件工作完成.你已经将这项工作序列化了 - 没有什么有用的并行发生.