代码如下:
一个:
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 会处理吗?
请您参考如下方法:
不,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() 等待单个工作完成,然后它允许循环继续甚至开始下一个工作。您已将工作序列化 - 没有任何有用的并行发生。
