上一篇文章為:→2.1.7進(jìn)程的創(chuàng)建-Process子類
進(jìn)程池Pool
當(dāng)需要?jiǎng)?chuàng)建的子進(jìn)程數(shù)量不多時(shí)务冕,可以直接利用multiprocessing中的Process動(dòng)態(tài)成生多個(gè)進(jìn)程,但如果是上百甚至上千個(gè)目標(biāo),手動(dòng)的去創(chuàng)建進(jìn)程的工作量巨大盗誊,此時(shí)就可以用到multiprocessing模塊提供的Pool方法。
初始化Pool時(shí)隘弊,可以指定一個(gè)最大進(jìn)程數(shù)哈踱,當(dāng)有新的請求提交到Pool中時(shí),如果池還沒有滿梨熙,那么就會(huì)創(chuàng)建一個(gè)新的進(jìn)程用來執(zhí)行該請求开镣;但如果池中的進(jìn)程數(shù)已經(jīng)達(dá)到指定的最大值,那么該請求就會(huì)等待咽扇,直到池中有進(jìn)程結(jié)束邪财,才會(huì)創(chuàng)建新的進(jìn)程來執(zhí)行,請看下面的實(shí)例:
from multiprocessing import Pool
import os,time,random
def worker(msg):
t_start = time.time()
print("%s開始執(zhí)行,進(jìn)程號(hào)為%d"%(msg,os.getpid()))
#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))
po=Pool(3) #定義一個(gè)進(jìn)程池树埠,最大進(jìn)程數(shù)3
for i in range(0,10):
#Pool.apply_async(要調(diào)用的目標(biāo),(傳遞給目標(biāo)的參數(shù)元祖,))
#每次循環(huán)將會(huì)用空閑出來的子進(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----
0開始執(zhí)行,進(jìn)程號(hào)為21466
1開始執(zhí)行,進(jìn)程號(hào)為21468
2開始執(zhí)行,進(jìn)程號(hào)為21467
0 執(zhí)行完畢怎憋,耗時(shí)1.01
3開始執(zhí)行,進(jìn)程號(hào)為21466
2 執(zhí)行完畢,耗時(shí)1.24
4開始執(zhí)行,進(jìn)程號(hào)為21467
3 執(zhí)行完畢,耗時(shí)0.56
5開始執(zhí)行,進(jìn)程號(hào)為21466
1 執(zhí)行完畢绊袋,耗時(shí)1.68
6開始執(zhí)行,進(jìn)程號(hào)為21468
4 執(zhí)行完畢毕匀,耗時(shí)0.67
7開始執(zhí)行,進(jìn)程號(hào)為21467
5 執(zhí)行完畢,耗時(shí)0.83
8開始執(zhí)行,進(jìn)程號(hào)為21466
6 執(zhí)行完畢癌别,耗時(shí)0.75
9開始執(zhí)行,進(jìn)程號(hào)為21468
7 執(zhí)行完畢皂岔,耗時(shí)1.03
8 執(zhí)行完畢,耗時(shí)1.05
9 執(zhí)行完畢规个,耗時(shí)1.69
-----end-----
multiprocessing.Pool常用函數(shù)解析:
apply_async(func[, args[, kwds]]) :使用非阻塞方式調(diào)用func(并行執(zhí)行凤薛,堵塞方式必須等待上一個(gè)進(jìn)程退出才能執(zhí)行下一個(gè)進(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,time,random
def worker(msg):
t_start = time.time()
print("%s開始執(zhí)行,進(jìn)程號(hào)為%d"%(msg,os.getpid()))
#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))
po=Pool(3) #定義一個(gè)進(jìn)程池镀迂,最大進(jìn)程數(shù)3
for i in range(0,10):
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é)果:
0開始執(zhí)行,進(jìn)程號(hào)為21532
0 執(zhí)行完畢探遵,耗時(shí)1.91
1開始執(zhí)行,進(jìn)程號(hào)為21534
1 執(zhí)行完畢,耗時(shí)1.72
2開始執(zhí)行,進(jìn)程號(hào)為21533
2 執(zhí)行完畢妓柜,耗時(shí)0.50
3開始執(zhí)行,進(jìn)程號(hào)為21532
3 執(zhí)行完畢箱季,耗時(shí)1.27
4開始執(zhí)行,進(jìn)程號(hào)為21534
4 執(zhí)行完畢,耗時(shí)1.05
5開始執(zhí)行,進(jìn)程號(hào)為21533
5 執(zhí)行完畢棍掐,耗時(shí)1.60
6開始執(zhí)行,進(jìn)程號(hào)為21532
6 執(zhí)行完畢藏雏,耗時(shí)0.25
7開始執(zhí)行,進(jìn)程號(hào)為21534
7 執(zhí)行完畢,耗時(shí)0.63
8開始執(zhí)行,進(jìn)程號(hào)為21533
8 執(zhí)行完畢作煌,耗時(shí)1.21
9開始執(zhí)行,進(jìn)程號(hào)為21532
9 執(zhí)行完畢掘殴,耗時(shí)0.60
----start----
-----end-----