新聞中心

創(chuàng)新互聯專注于企業(yè)成都全網營銷推廣、網站重做改版、舒城網站定制設計、自適應品牌網站建設、H5場景定制、成都商城網站開發(fā)、集團公司官網建設、成都外貿網站建設、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為舒城等各大城市提供網站開發(fā)制作服務。
進程池Pool
當需要創(chuàng)建的子進程數量不多時,可以直接利用multiprocessing中的Process動態(tài)成生多個進程,但如果是上百甚至上千個目標,手動的去創(chuàng)建進程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法。
初始化Pool時,可以指定一個進程數,當有新的請求提交到Pool中時,如果池還沒有滿,那么就會創(chuàng)建一個新的進程用來執(zhí)行該請求;但如果池中的進程數已經達到指定的值,那么該請求就會等待,直到池中有進程結束,才會創(chuàng)建新的進程來執(zhí)行。
from multiprocessing import Pool
import os
import time
import random
def worker(msg):
t_start = time.time()
print("%d進程開始執(zhí)行%d"%(os.getpid(),msg))
#random.random()隨機生成0~1之間的浮點數
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"執(zhí)行完畢,耗時%0.2f"%(t_stop-t_start))
if __name__ == '__main__':
po=Pool(3) #定義一個進程池,進程數3
for i in range(0,10):
#Pool.apply_async(要調用的目標,(傳遞給目標的參數元祖,))
#每次循環(huán)將會用空閑出來的子進程去調用目標
po.apply_async(worker,(i,))
print("----start----")
po.close() #關閉進程池,關閉后po不再接收新的請求
po.join() #等待po中所有子進程執(zhí)行完成,必須放在close語句之后
print("-----end-----")運行結果為:
----start---- 4353進程開始執(zhí)行0 4354進程開始執(zhí)行1 4355進程開始執(zhí)行2 2,執(zhí)行完畢,耗時0.20 4355進程開始執(zhí)行3 1,執(zhí)行完畢,耗時1.19 4354進程開始執(zhí)行4 4,執(zhí)行完畢,耗時0.37 4354進程開始執(zhí)行5 0,執(zhí)行完畢,耗時1.57 4353進程開始執(zhí)行6 5,執(zhí)行完畢,耗時0.19 4354進程開始執(zhí)行7 3,執(zhí)行完畢,耗時1.63 4355進程開始執(zhí)行8 6,執(zhí)行完畢,耗時0.49 4353進程開始執(zhí)行9 8,執(zhí)行完畢,耗時0.75 7,執(zhí)行完畢,耗時0.90 9,執(zhí)行完畢,耗時0.63 -----end-----
相關推薦:《python視頻教程》
multiprocessing.Pool常用函數解析:
apply_async(func[, args[, kwds]]) :使用非阻塞方式調用func(并行執(zhí)行,堵塞方式必須等待上一個進程退出才能執(zhí)行下一個進程),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進程開始執(zhí)行%d"%(os.getpid(),msg))
#random.random()隨機生成0~1之間的浮點數
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"執(zhí)行完畢,耗時%0.2f"%(t_stop-t_start))
if __name__ == '__main__':
po=Pool(3) #定義一個進程池,進程數3
for i in range(0,10):
#Pool.apply_async(要調用的目標,(傳遞給目標的參數元祖,))
#每次循環(huán)將會用空閑出來的子進程去調用目標
po.apply(worker,(i,))
print("----start----")
po.close() #關閉進程池,關閉后po不再接收新的請求
po.join() #等待po中所有子進程執(zhí)行完成,必須放在close語句之后
print("-----end-----")運行結果為:
4400進程開始執(zhí)行0 0,執(zhí)行完畢,耗時1.89 4401進程開始執(zhí)行1 1,執(zhí)行完畢,耗時1.91 4402進程開始執(zhí)行2 2,執(zhí)行完畢,耗時1.64 4400進程開始執(zhí)行3 3,執(zhí)行完畢,耗時1.16 4401進程開始執(zhí)行4 4,執(zhí)行完畢,耗時1.85 4402進程開始執(zhí)行5 5,執(zhí)行完畢,耗時0.29 4400進程開始執(zhí)行6 6,執(zhí)行完畢,耗時0.19 4401進程開始執(zhí)行7 7,執(zhí)行完畢,耗時1.19 4402進程開始執(zhí)行8 8,執(zhí)行完畢,耗時0.61 4400進程開始執(zhí)行9 9,執(zhí)行完畢,耗時1.08 ----start---- -----end-----
說明:通過運行結果可以看出來,阻塞式會等進程池中的進程都執(zhí)行完畢了才會運行主進程的start和end的打印
相關推薦:
Python中的進程是什么
網頁名稱:創(chuàng)新互聯Python教程:Python中的進程池是什么
當前網址:http://m.fisionsoft.com.cn/article/coecgsp.html


咨詢
建站咨詢
