使用功能multiprocessing.Pool在python中产生奇怪的结果?

时间:2018-09-29 03:59:25

标签: python python-3.x multiprocessing 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)

另一个:

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阻止程序吗?

1 个答案:

答案 0 :(得分:5)

否,append()不会阻止,但是.get()会阻止。 .get()目的被阻止。在

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

all 在第二行调用 any .get()之前,第一行将工作分配给池。但是在

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

.get()等待单项工作完成,然后才允许循环继续甚至开始下一项工作。您已经完成了工作的序列化-并行无用。