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

2024-03-29 09:21:28 发布

您现在位置: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.5秒,而后者花费10秒。 为什么?做列表.append阻止进程?你知道吗


Tags: inimportfordatetimereturntimedefrange
1条回答
网友
1楼 · 发布于 2024-03-29 09:21:28

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

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

all在第二行调用任何.get()之前,工作由第一行提供给池。但是在

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

.get()在允许循环继续甚至开始下一个工作之前,等待单个工作完成。你已经序列化了工作-没有任何有用的并行发生。你知道吗

相关问题 更多 >