Python多任務(6.Python中進程池Pool)

進程池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-----
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章