Skip to main content
 首页 » 编程设计

python之使用函数 multiprocessing.Pool 在 python 中出现奇怪的结果

2025年05月04日24lidabo

代码如下:

一个:

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() 等待单个工作完成,然后它允许循环继续甚至开始下一个工作。您已将工作序列化 - 没有任何有用的并行发生。