進程池Pool
(1).當創建的任務不多時,可以利用multiprocessing中的Process動態生產多個進程,
但如果有上百或上千目標,手動的去創建進程的工作量巨大,此時就可以用到multiprocess模塊提供的Pool方法。
(2). 在進程池中,可以指定一個最大進程數,如果有新的請求提交到進程池中,如果池還沒有滿,那麼就會創建一個新的進程
用來執行該請求,但如果池中的進程數已經達到指定的最大值,那麼該請求就會等待,直到池中有進程結束,纔會
用之前的進程來執行新的任務。
(3). 任務數不確定情況下,利用進程池
1.進程池的創建
from multiprocessing import Pool # 導入
po = Pool(3) # 定義一個進程池,最大的進程池爲3
po.apply_async(要調用的目標,(傳遞給目標的參數元組,))
po.close() # 關閉進程池,關閉後po不再接受新的請求
po.join() # 等待po中所有子進程執行完成。
from multiprocessing import Pool
import os,time,random
def worker(msg):
t_start = time.time()
print("%s開始執行,進程號爲%d"%(msg,os.getpid()))
time.sleep(random.random()*2) # random.random()隨機成0-1的浮點數
t_stop = time.time()
print(msg,"執行完畢,耗時%0.2f"%(t_stop-t_start))
if __name__ == '__main__':
po = Pool(3) # 最大的進程數爲3
for i in range(0,10):
'''每次循環將會用空閒出來的子進程去調用目標'''
po.apply_async(worker,(i,))
print("----start----")
po.close() # 關閉進程池,關閉後po不再接受新的請求
po.join() # 等待po中的所有子進程執行完成,必須放在close語句之後
'''如果沒有添加join(),會導致有的代碼沒有運行就已經結束了'''
print("-----end-----")
執行結果: 發現一共執行的就只有3個進程,代碼要執行時,先看進程池裏面滿了沒有,如果滿了,
就 等待 進程池裏面進程執行完之後,在去用這個進程去執行
----start----
0開始執行,進程號爲4804
1開始執行,進程號爲29068
2開始執行,進程號爲24580
0 執行完畢,耗時0.04
3開始執行,進程號爲4804
3 執行完畢,耗時0.47
4開始執行,進程號爲4804
4 執行完畢,耗時0.57
5開始執行,進程號爲4804
1 執行完畢,耗時1.76
6開始執行,進程號爲29068
2 執行完畢,耗時1.97
7開始執行,進程號爲24580
5 執行完畢,耗時1.06
8開始執行,進程號爲4804
6 執行完畢,耗時0.57
9開始執行,進程號爲29068
8 執行完畢,耗時0.80
7 執行完畢,耗時1.75
9 執行完畢,耗時1.95
-----end-----