multiprocessing.Process() ----------python中的多進程


python 當中 使用封裝好的 multiprocessing 為我們實現創建多進程任務。  

1 Process()方法創建子進程

使用multiprocessing.Process() 方法產生一個子進程
基本過程如下:
 1 from multiprocessing import Process  2 import os  3 from time import sleep  4 # 1 指定一個功能,綁定給子進程去完成
 5 def proc_fun(age ):  6     sleep(3)  7     print("我是子進程%s,age=%s"%( os.getpid() , age ) )  8 
 9 if __name__ =="__main__": 10     # 2 創建一個進程實例對象
11     #Process() 接收target 代表綁定要完成的函數,不綁定默認執行run方法,第二個元組是傳入置頂函數的參數列表,
12     # 還可以選擇性傳參 name代表新建的子進程名字,還可以傳入一個字典
13     p = Process( target=proc_fun ,args=( 18, ),name="哈哈1號子進程" ) 14     # 3 用start() 方法將進程創建出來並且運行
15     print("子進程開始執行。。。。") 16  p.start() 17     print("子進程已開啟%s。。。。"%p.name) 18     print("開啟阻塞收集。。。") 19     p.join()#用join()方法回收子進程的資源,可以傳入參數多久后回收
20             # 默認是阻塞回收,代表運行完成后再回收該進程的資源 等待期間主進程不繼續向下進行
21     print("收集結束")

 

2 創建多個子進程的垃圾回收:
父進程可以生成子進程,子進程再生成子進程,局面很混亂
因為子進程的資源回收全是父進程接管的。如果父進程沒有回收資源,那么子進程就會丟給1號pid的進程去管理
所以我們大量生成子進程的時候,要用父進程去生成,然后用父進程進行回收子進程的資源
 1 from multiprocessing import Process  2 import os  3 
 4 # 1 定義一個子進程需要完成的功能
 5 def proc_fun( num ,m ):  6     print("我是子進程%s,我是第%s號被創建的 m=%s"%(os.getpid(),num , m))  7 if __name__ == "__main__":  8     # 2 聲明一個子進程的對象,循環調用 用一個父進程生成多個子進程
 9     jobs = [] 10     for i in range(10): 11         p = Process(target=proc_fun , args=(i,) ,kwargs={ "m":15 }) 12  p.start() 13  jobs.append(p ) 14 
15     print("進程開啟結束,下面進行收集資源") 16 
17     for job in jobs: 18  job.join() 19         print("已經釋放了:%s"%(p.name ) )

 

3 Process函數常用的參數、屬性:

Process語法結構如下:

Process([group [, target [, name [, args [, kwargs]]]]])

target:表示這個進程實例所調用對象;

args:表示調用對象的位置參數元組;

kwargs:表示調用對象的關鍵字參數字典;

name:為當前進程實例的別名;

group:大多數情況下用不到;

Process類常用方法:

is_alive():判斷進程實例是否還在執行;

join([timeout]):是否等待進程實例執行結束,或等待多少秒;

start():啟動進程實例(創建子進程);

run():如果沒有給定target參數,對這個對象調用start()方法時,就將執行對象中的run()方法;

terminate():不管任務是否完成,立即終止;

Process類常用屬性:

name:當前進程實例別名,默認為Process-N,N為從1開始遞增的整數;

pid:當前進程實例的PID值;


4 用類來實現創建進程對象:
我們可以定義一個類,繼承Process
實例化一個對象的時候,就會創建一個子進程
關鍵點是重寫父類的run方法 調用start的時候默認調用run方法
 1 from multiprocessing import Process  2 # 自己寫一個類 繼承在Process
 3 class Proc( Process ):  4     #實際上在調用子進程的start() 的時候,默認會執行run() 方法
 5     # 所以要把主要的邏輯寫在run方法當中
 6     def run(self):  7  self.sing()  8 
 9     def sing(self): 10         print("正在唱歌!。。。") 11 
12 
13 if __name__ == "__main__": 14     p = Proc() 15     print("子進程開始執行:") 16  p.start() 17     p.join()

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM