使用函数多处理的python中的一个奇怪结果.池?



这是代码:

一:

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。 为什么?列表.追加块是否处理?

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

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

第二行调用任何.get()之前,第一行将所有工作交给池。 但在

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

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

相关内容

  • 没有找到相关文章

最新更新