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