您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)什么是Python中的進(jìn)程池,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
進(jìn)程池Pool
當(dāng)需要創(chuàng)建的子進(jìn)程數(shù)量不多時(shí),可以直接利用multiprocessing中的Process動態(tài)成生多個進(jìn)程,但如果是上百甚至上千個目標(biāo),手動的去創(chuàng)建進(jìn)程的工作量巨大,此時(shí)就可以用到multiprocessing模塊提供的Pool方法。
初始化Pool時(shí),可以指定一個最大進(jìn)程數(shù),當(dāng)有新的請求提交到Pool中時(shí),如果池還沒有滿,那么就會創(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í)行完畢,耗時(shí)%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í)行完畢,耗時(shí)0.20 4355進(jìn)程開始執(zhí)行3 1,執(zhí)行完畢,耗時(shí)1.19 4354進(jìn)程開始執(zhí)行4 4,執(zhí)行完畢,耗時(shí)0.37 4354進(jìn)程開始執(zhí)行5 0,執(zhí)行完畢,耗時(shí)1.57 4353進(jìn)程開始執(zhí)行6 5,執(zhí)行完畢,耗時(shí)0.19 4354進(jìn)程開始執(zhí)行7 3,執(zhí)行完畢,耗時(shí)1.63 4355進(jìn)程開始執(zhí)行8 6,執(zhí)行完畢,耗時(shí)0.49 4353進(jìn)程開始執(zhí)行9 8,執(zhí)行完畢,耗時(shí)0.75 7,執(zhí)行完畢,耗時(shí)0.90 9,執(zhí)行完畢,耗時(shí)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í)行完畢,耗時(shí)%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í)行完畢,耗時(shí)1.89 4401進(jìn)程開始執(zhí)行1 1,執(zhí)行完畢,耗時(shí)1.91 4402進(jìn)程開始執(zhí)行2 2,執(zhí)行完畢,耗時(shí)1.64 4400進(jìn)程開始執(zhí)行3 3,執(zhí)行完畢,耗時(shí)1.16 4401進(jìn)程開始執(zhí)行4 4,執(zhí)行完畢,耗時(shí)1.85 4402進(jìn)程開始執(zhí)行5 5,執(zhí)行完畢,耗時(shí)0.29 4400進(jìn)程開始執(zhí)行6 6,執(zhí)行完畢,耗時(shí)0.19 4401進(jìn)程開始執(zhí)行7 7,執(zhí)行完畢,耗時(shí)1.19 4402進(jìn)程開始執(zhí)行8 8,執(zhí)行完畢,耗時(shí)0.61 4400進(jìn)程開始執(zhí)行9 9,執(zhí)行完畢,耗時(shí)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ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。