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()
相關文章
相關標籤/搜索