1.進(jìn)程Process
multiprocessing模塊提供了一個Process類來創(chuàng)建一個進(jìn)程對象
創(chuàng)建子進(jìn)程時顽照,只需要傳入一個執(zhí)行函數(shù)和函數(shù)的參數(shù)乏冀,創(chuàng)建一個Process實例筐付,用start()方法啟動啊片,這樣創(chuàng)建進(jìn)程比fork()還要簡單涛浙。
join()方法可以等待子進(jìn)程結(jié)束后再繼續(xù)往下運(yùn)行说庭,相當(dāng)于阻塞進(jìn)程然磷,通常用于進(jìn)程間的同步。
Process語法結(jié)構(gòu)如下:
Process([group [, target [, name [, args [, kwargs]]]]])
target:表示這個進(jìn)程實例所調(diào)用對象(多為函數(shù))刊驴;
args:表示調(diào)用對象的位置參數(shù)元組姿搜;
kwargs:表示調(diào)用對象的關(guān)鍵字參數(shù)字典;
name:為當(dāng)前進(jìn)程實例的別名捆憎;
group:大多數(shù)情況下用不到舅柜;
Process類常用方法:
is_alive():判斷進(jìn)程實例是否還在執(zhí)行;
join([timeout]):是否等待進(jìn)程實例執(zhí)行結(jié)束躲惰,或等待多少秒致份;
start():啟動進(jìn)程實例(創(chuàng)建子進(jìn)程);
run():如果沒有給定target參數(shù)础拨,對這個對象調(diào)用start()方法時氮块,就將執(zhí)行對象中的run()方法;
terminate():不管任務(wù)是否完成诡宗,立即終止滔蝉;
Process類常用屬性:
name:當(dāng)前進(jìn)程實例別名,默認(rèn)為Process-N塔沃,N為從1開始遞增的整數(shù)蝠引;
pid:當(dāng)前進(jìn)程實例的PID值;
Process類調(diào)用實例
2.進(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í)行
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之后使用爪模;
Pool調(diào)用實例
3.進(jìn)程間的通訊 通訊隊列Queue
可以使用multiprocessing模塊的Queue實現(xiàn)多進(jìn)程之間的數(shù)據(jù)傳遞,Queue本身是一個消息列隊程序
初始化Queue()對象時(例如:q=Queue())荚藻,若括號中沒有指定最大可接收的消息數(shù)量屋灌,或數(shù)量為負(fù)值,那么就代表可接受的消息數(shù)量沒有上限(直到內(nèi)存的盡頭)鞋喇;
Queue.qsize():返回當(dāng)前隊列包含的消息數(shù)量声滥;
Queue.empty():如果隊列為空,返回True侦香,反之False 落塑;
Queue.full():如果隊列滿了,返回True,反之False罐韩;
Queue.get([block[, timeout]]):獲取隊列中的一條消息憾赁,然后將其從列隊中移除,block默認(rèn)值為True散吵;
1)如果block使用默認(rèn)值龙考,且沒有設(shè)置timeout(單位秒),消息列隊如果為空矾睦,此時程序?qū)⒈蛔枞ㄍT谧x取狀態(tài))晦款,直到從消息列隊讀到消息為止,如果設(shè)置了timeout枚冗,則會等待timeout秒缓溅,若還沒讀取到任何消息,則拋出"Queue.Empty"異常赁温;
2)如果block值為False坛怪,消息列隊如果為空,則會立刻拋出"Queue.Empty"異常股囊;
Queue.get_nowait():相當(dāng)Queue.get(False)袜匿;
Queue.put(item,[block[, timeout]]):將item消息寫入隊列,block默認(rèn)值為True稚疹;
1)如果block使用默認(rèn)值居灯,且沒有設(shè)置timeout(單位秒),消息列隊如果已經(jīng)沒有空間可寫入,此時程序?qū)⒈蛔枞ㄍT趯懭霠顟B(tài))穆壕,直到從消息列隊騰出空間為止待牵,如果設(shè)置了timeout,則會等待timeout秒喇勋,若還沒空間,則拋出"Queue.Full"異常偎行;
2)如果block值為False川背,消息列隊如果沒有空間可寫入,則會立刻拋出"Queue.Full"異常蛤袒;
Queue.put_nowait(item):相當(dāng)Queue.put(item, False)熄云;
Queue的基本使用
4.進(jìn)程池中的通信
如果要使用Pool創(chuàng)建進(jìn)程,就需要使用multiprocessing.Manager()中的Queue()妙真,而不是multiprocessing.Queue()
既:
?q = Manager().Queue();?