multiprocessiong.Pool多进程池中,可以使用的并行方法有:
map, apply, map_async, apply_async
四种方法的区别如下:
简单来说:
map(map_async) 与 apply(apply_async)的区别是:apply可以在循环中传递多种参数,map只支持一种迭代器的参数
apply与apply_async的区别:apply会在执行每一个进程的过程中阻塞,就是每读取一次参数执行一次,等到执行结束再读取下一个参数;async表示异步进行,apply_async会将所有参数读入内存并返回,在子进程执行时再阻塞。
下面通过实验说明:
# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random
def worker(i):
# random.random()随机生成0~1之间的浮点数
time.sleep(1)
print(i)
if __name__ == '__main__':
start = time.time()
po = Pool(3) # 定义一个进程池,最大进程数3
for i in range(0, 10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply(worker, (i,))
end = time.time()
print("----循环耗时----:"+str(end-start))
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
end2 = time.time()
print("-----进程耗时-----:"+ str(end2-start))
start = time.time()
po = Pool(3) # 定义一个进程池,最大进程数3
for i in range(0, 10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker, (i,))
end = time.time()
print("----循环耗时----:"+str(end-start))
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
end2 = time.time()
print("-----进程耗时-----:" + str(end2-start))
start = time.time()
po = Pool(3) # 定义一个进程池,最大进程数3
# for i in range(0, 10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.map(worker, [i for i in range(10)])
end = time.time()
print("----循环耗时----:"+str(end-start))
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
end2 = time.time()
print("-----进程耗时-----:"+ str(end2-start))
start = time.time()
po = Pool(3) # 定义一个进程池,最大进程数3
# for i in range(0, 10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.map_async(worker, [i for i in range(10)])
end = time.time()
print("----循环耗时----:" + str(end - start))
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
end2 = time.time()
print("-----进程耗时-----:" + str(end2 - start))
执行结果:
0
1
2
3
4
5
6
7
8
9
----循环耗时----:10.227928638458252
-----进程耗时-----:10.324309349060059
----循环耗时----:0.022059917449951172
0
2
1
3
5
4
6
8
7
9
-----进程耗时-----:4.296982288360596
0
1
2
3
4
5
6
7
8
9
----循环耗时----:4.203247785568237
-----进程耗时-----:4.285009384155273
----循环耗时----:0.016041994094848633
1
0
2
3
4
5
7
6
8
9
-----进程耗时-----:4.283062696456909