進程:
多任務
概念,操作系統(tǒng)同時運行多個任務
fork(創(chuàng)建進程)
導入os模塊
程序運行到os.fork時,系統(tǒng)會創(chuàng)建一個子進程,然后把父進程復制一份到子進程,子進程的值一定是0,父進程返回子進程的id
getpid(),getppid()
getpid(),當前進程id,getppid父進程id
多次fork問題
父進程,子進程執(zhí)行順序沒有規(guī)律,完全取決于操作系統(tǒng)的系統(tǒng)調(diào)度算法
multiprocessing
跨版本多進程模塊
import Process (multiprocessing)
說明
創(chuàng)建子進程時蜒秤,只需要傳入一個執(zhí)行函數(shù)和函數(shù)的參數(shù)怎棱,創(chuàng)建一個Process實例,用start()方法啟動,這樣創(chuàng)建進程比fork()還要簡單。
·join()方法可以等待子進程結(jié)束后再繼續(xù)往下運行,通常用于進程間的同步。
·target:表示這個進程實例所調(diào)用對象;
·args:表示調(diào)用對象的位置參數(shù)元組磷仰;
·kwargs:表示調(diào)用對象的關鍵字參數(shù)字典;
·name:為當前進程實例的別名境蔼;
·group:大多數(shù)情況下用不到灶平;
Process類常用方法:
·is_alive():判斷進程實例是否還在執(zhí)行伺通;
·join([timeout]):是否等待進程實例執(zhí)行結(jié)束,或等待多少秒逢享;
·start():啟動進程實例(創(chuàng)建子進程)罐监;
·run():如果沒有給定target參數(shù),對這個對象調(diào)用start()方法時瞒爬,就將執(zhí)行對象中的run()方法弓柱;
·terminate():不管任務是否完成,立即終止侧但;
Process類常用屬性:
·name:當前進程實例別名矢空,默認為Process-N,N為從1開始遞增的整數(shù)禀横;
·pid:當前進程實例的PID值屁药;
進程的創(chuàng)建-Process子類:
創(chuàng)建新的進程還能夠使用類的方式,可以自定義一個類柏锄,繼承Process類酿箭,每次實例化這個類的時候,就等同于實例化一個進程對象
方法類和繼承類的對比:
繼承類是以面向?qū)ο髮ο髞砜紤]這個事的,所以業(yè)務邏輯復雜建議使用繼承類,更好理解.
進程池pool:
當需要創(chuàng)建的子進程數(shù)量不多時趾娃,可以直接利用multiprocessing中的Process動態(tài)成生多個進程缭嫡,但如果是上百甚至上千個目標,手動的去創(chuàng)建進程的工作量巨大抬闷,此時就可以用到multiprocessing模塊提供的Pool方法械巡。
初始化Pool時,可以指定一個最大進程數(shù)饶氏,當有新的請求提交到Pool中時,如果池還沒有滿有勾,那么就會創(chuàng)建一個新的進程用來執(zhí)行該請求疹启;但如果池中的進程數(shù)已經(jīng)達到指定的最大值,那么該請求就會等待蔼卡,直到池中有進程結(jié)束喊崖,才會創(chuàng)建新的進程來執(zhí)行
multiprocessing.Pool常用函數(shù)解析:
·apply_async(func[, args[, kwds]]):使用非阻塞方式調(diào)用func(并行執(zhí)行,堵塞方式必須等待上一個進程退出才能執(zhí)行下一個進程)雇逞,args為傳遞給func的參數(shù)列表荤懂,kwds為傳遞給func的關鍵字參數(shù)列表;
·apply(func[, args[, kwds]]):使用阻塞方式調(diào)用func
·close():關閉Pool塘砸,使其不再接受新的任務节仿;
·terminate():不管任務是否完成,立即終止掉蔬;
·join():主進程阻塞廊宪,等待子進程的退出矾瘾,必須在close或terminate之后使用;
進程間通信-Queue
可以使用multiprocessing模塊的Queue實現(xiàn)多進程之間的數(shù)據(jù)傳遞箭启,Queue本身是一個消息列隊程序
-margi
·Queue.qsize():返回當前隊列包含的消息數(shù)量壕翩;
·Queue.empty():如果隊列為空,返回True傅寡,反之False放妈;
·Queue.full():如果隊列滿了,返回True,反之False荐操;
·Queue.get([block[, timeout]]):獲取隊列中的一條消息芜抒,然后將其從列隊中移除,block默認值為True淀零;
1)如果block使用默認值挽绩,且沒有設置timeout(單位秒),消息列隊如果為空驾中,此時程序?qū)⒈蛔枞ㄍT谧x取狀態(tài))唉堪,直到從消息列隊讀到消息為止,如果設置了timeout肩民,則會等待timeout秒唠亚,若還沒讀取到任何消息,則拋出"Queue.Empty"異常持痰;
2)如果block值為False灶搜,消息列隊如果為空,則會立刻拋出"Queue.Empty"異常工窍;
·Queue.get_nowait():相當Queue.get(False)割卖;
·Queue.put(item,[block[, timeout]]):將item消息寫入隊列,block默認值為True患雏;
1)如果block使用默認值鹏溯,且沒有設置timeout(單位秒),消息列隊如果已經(jīng)沒有空間可寫入淹仑,此時程序?qū)⒈蛔枞ㄍT趯懭霠顟B(tài))丙挽,直到從消息列隊騰出空間為止,如果設置了timeout匀借,則會等待timeout秒颜阐,若還沒空間,則拋出"Queue.Full"異常吓肋;
2)如果block值為False凳怨,消息列隊如果沒有空間可寫入,則會立刻拋出"Queue.Full"異常蓬坡;
·Queue.put_nowait(item):相當Queue.put(item, False)猿棉;