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()