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阻止进程?
不,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()允许循环继续开始下一项工作之前等待单件工作完成.你已经将这项工作序列化了 - 没有什么有用的并行发生.