什么是Python中的進(jìn)程池

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

成都創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)陽新,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

進(jìn)程池Pool

當(dāng)需要創(chuàng)建的子進(jìn)程數(shù)量不多時,可以直接利用multiprocessing中的Process動態(tài)成生多個進(jìn)程,但如果是上百甚至上千個目標(biāo),手動的去創(chuàng)建進(jìn)程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法。

初始化Pool時,可以指定一個最大進(jìn)程數(shù),當(dāng)有新的請求提交到Pool中時,如果池還沒有滿,那么就會創(chuàng)建一個新的進(jìn)程用來執(zhí)行該請求;但如果池中的進(jìn)程數(shù)已經(jīng)達(dá)到指定的最大值,那么該請求就會等待,直到池中有進(jìn)程結(jié)束,才會創(chuàng)建新的進(jìn)程來執(zhí)行。

from multiprocessing import Pool
import os
import time
import random
def worker(msg):
    t_start = time.time()
    print("%d進(jìn)程開始執(zhí)行%d"%(os.getpid(),msg))
    #random.random()隨機(jī)生成0~1之間的浮點(diǎn)數(shù)
    time.sleep(random.random()*2) 
    t_stop = time.time()
    print(msg,"執(zhí)行完畢,耗時%0.2f"%(t_stop-t_start))
if __name__ == '__main__':
    po=Pool(3) #定義一個進(jìn)程池,最大進(jìn)程數(shù)3
    for i in range(0,10):
        #Pool.apply_async(要調(diào)用的目標(biāo),(傳遞給目標(biāo)的參數(shù)元祖,))
        #每次循環(huán)將會用空閑出來的子進(jìn)程去調(diào)用目標(biāo)
        po.apply_async(worker,(i,))
    print("----start----")
    po.close() #關(guān)閉進(jìn)程池,關(guān)閉后po不再接收新的請求
    po.join() #等待po中所有子進(jìn)程執(zhí)行完成,必須放在close語句之后
    print("-----end-----")

運(yùn)行結(jié)果為:

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

multiprocessing.Pool常用函數(shù)解析:

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

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

close():關(guān)閉Pool,使其不再接受新的任務(wù);

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

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

apply堵塞式

from multiprocessing import Pool
import os
import time
import random
def worker(msg):
    t_start = time.time()
    print("%d進(jìn)程開始執(zhí)行%d"%(os.getpid(),msg))
    #random.random()隨機(jī)生成0~1之間的浮點(diǎn)數(shù)
    time.sleep(random.random()*2) 
    t_stop = time.time()
    print(msg,"執(zhí)行完畢,耗時%0.2f"%(t_stop-t_start))
if __name__ == '__main__':
    po=Pool(3) #定義一個進(jìn)程池,最大進(jìn)程數(shù)3
    for i in range(0,10):
        #Pool.apply_async(要調(diào)用的目標(biāo),(傳遞給目標(biāo)的參數(shù)元祖,))
        #每次循環(huán)將會用空閑出來的子進(jìn)程去調(diào)用目標(biāo)
        po.apply(worker,(i,))
    print("----start----")
    po.close() #關(guān)閉進(jìn)程池,關(guān)閉后po不再接收新的請求
    po.join() #等待po中所有子進(jìn)程執(zhí)行完成,必須放在close語句之后
    print("-----end-----")

運(yùn)行結(jié)果為:

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

說明:通過運(yùn)行結(jié)果可以看出來,阻塞式會等進(jìn)程池中的進(jìn)程都執(zhí)行完畢了才會運(yùn)行主進(jìn)程的start和end的打印

以上就是什么是Python中的進(jìn)程池,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁標(biāo)題:什么是Python中的進(jìn)程池
瀏覽路徑:http://muchs.cn/article44/ghehee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站微信小程序、手機(jī)網(wǎng)站建設(shè)定制網(wǎng)站、網(wǎng)站導(dǎo)航、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名