溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是Python中的進程池

發布時間:2020-08-25 14:30:48 來源:億速云 閱讀:208 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關什么是Python中的進程池,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

進程池Pool

當需要創建的子進程數量不多時,可以直接利用multiprocessing中的Process動態成生多個進程,但如果是上百甚至上千個目標,手動的去創建進程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法。

初始化Pool時,可以指定一個最大進程數,當有新的請求提交到Pool中時,如果池還沒有滿,那么就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到指定的最大值,那么該請求就會等待,直到池中有進程結束,才會創建新的進程來執行。

from multiprocessing import Pool
import os
import time
import random
def worker(msg):
    t_start = time.time()
    print("%d進程開始執行%d"%(os.getpid(),msg))
    #random.random()隨機生成0~1之間的浮點數
    time.sleep(random.random()*2) 
    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):
        #Pool.apply_async(要調用的目標,(傳遞給目標的參數元祖,))
        #每次循環將會用空閑出來的子進程去調用目標
        po.apply_async(worker,(i,))
    print("----start----")
    po.close() #關閉進程池,關閉后po不再接收新的請求
    po.join() #等待po中所有子進程執行完成,必須放在close語句之后
    print("-----end-----")

運行結果為:

----start----
4353進程開始執行0
4354進程開始執行1
4355進程開始執行2
2,執行完畢,耗時0.20
4355進程開始執行3
1,執行完畢,耗時1.19
4354進程開始執行4
4,執行完畢,耗時0.37
4354進程開始執行5
0,執行完畢,耗時1.57
4353進程開始執行6
5,執行完畢,耗時0.19
4354進程開始執行7
3,執行完畢,耗時1.63
4355進程開始執行8
6,執行完畢,耗時0.49
4353進程開始執行9
8,執行完畢,耗時0.75
7,執行完畢,耗時0.90
9,執行完畢,耗時0.63
-----end-----

multiprocessing.Pool常用函數解析:

apply_async(func[, args[, kwds]]) :使用非阻塞方式調用func(并行執行,堵塞方式必須等待上一個進程退出才能執行下一個進程),args為傳遞給func的參數列表,kwds為傳遞給func的關鍵字參數列表;

apply(func[, args[, kwds]]):使用阻塞方式調用func

close():關閉Pool,使其不再接受新的任務;

terminate():不管任務是否完成,立即終止;

join():主進程阻塞,等待子進程的退出, 必須在close或terminate之后使用;

apply堵塞式

from multiprocessing import Pool
import os
import time
import random
def worker(msg):
    t_start = time.time()
    print("%d進程開始執行%d"%(os.getpid(),msg))
    #random.random()隨機生成0~1之間的浮點數
    time.sleep(random.random()*2) 
    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):
        #Pool.apply_async(要調用的目標,(傳遞給目標的參數元祖,))
        #每次循環將會用空閑出來的子進程去調用目標
        po.apply(worker,(i,))
    print("----start----")
    po.close() #關閉進程池,關閉后po不再接收新的請求
    po.join() #等待po中所有子進程執行完成,必須放在close語句之后
    print("-----end-----")

運行結果為:

4400進程開始執行0
0,執行完畢,耗時1.89
4401進程開始執行1
1,執行完畢,耗時1.91
4402進程開始執行2
2,執行完畢,耗時1.64
4400進程開始執行3
3,執行完畢,耗時1.16
4401進程開始執行4
4,執行完畢,耗時1.85
4402進程開始執行5
5,執行完畢,耗時0.29
4400進程開始執行6
6,執行完畢,耗時0.19
4401進程開始執行7
7,執行完畢,耗時1.19
4402進程開始執行8
8,執行完畢,耗時0.61
4400進程開始執行9
9,執行完畢,耗時1.08
----start----
-----end-----

說明:通過運行結果可以看出來,阻塞式會等進程池中的進程都執行完畢了才會運行主進程的start和end的打印

以上就是什么是Python中的進程池,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女