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