上一篇文章: Python進程專題1:fork():建立子進程、getpid()、getppid()
下一篇文章: Python進程專題3:繼承Process來建立進程
因爲fork()沒法對Windows使用,而python是跨平臺的,顯然須要一個新的跨平臺替代品來代替它,那就是multiprocessing模塊。python
multiprocessing模塊中使用Process類來表明進程。segmentfault
語法:Process([group,target,name,args,kwargs]) group:至今還未使用,值始終爲None target:進程實例所調用的對象,通常表示子進程要調用的函數。 args:表示調用對象的參數,通常是函數的參數 kwargs:表示調用對象的關鍵字參數字典。 name:當前進程實例的別名
Process類經常使用方法:函數
p.is_alive():判斷進程是否還在運行。若是還在運行,返回true,不然返回false p.join([timeout]):等待進程實例執行完畢,或等待多少秒 p.run():默認會調用target指定的對象,若是沒有給定target參數,對該進程對象調用start()方法時,就會執行對象中的run()方法 p.start():啓動進程實例(建立子進程),病運行子進城的run方法 p.terminate():無論任務是否完成,當即終止,同時不會進行任何的清理工做,若是進程p建立了它本身的子進程,這些進程就會 變成殭屍進程,使用時特別注意,若是p保存了一個鎖或者參與了進程間通訊,那麼使用該方法終止它可能會致使死鎖或者I/O損壞。
Process類經常使用屬性:線程
p.daemon:布爾值,指示進程是不是後臺進程。當建立它的進程終止時,後臺進程會自動終止。而且,後臺進程沒法建立本身的新進城。 注意:p.daemon的值必須在p.start方法調用前設置。 p.exitcode:進程的整數退出指令。若是進程仍然在運行,它的值爲None,若是值爲負數:—N,就表示進程由信號N所終止。 p.name:當前進程實例別名,默認爲Process-N,N爲從1開始遞增的整數。 p.pid:當前進程實例的PID
實例1:理解單首創建進程的相關函數code
#該實例是用來理解單首創建進程的實例 from multiprocessing import Process import os,time #將要在子進程中運行的方法 def test(name,interval): for i in range(interval): print("子進程運行中,name=%s,pid=%d,父進程:%d"%(name,os.getpid(),os.getppid())) time.sleep(interval) if __name__=="__main__": print("父進程%d"%os.getpid()) #建立進程實例,第一個參數傳要在子線程執行的函數,第二個參數傳函數須要的參數 p=Process(target=test,args=('mark',2)) print("子進程要執行了") #啓動進程 p.start() p.join()#等待子進程運行結束再繼續執行下面語句 print("子進程結束了")
結果:對象
父進程17756 子進程要執行了 子進程運行中,name=mark,pid=17758,父進程:17756 子進程運行中,name=mark,pid=17758,父進程:17756 子進程結束了
實例2:兩個進程同時運行繼承
from multiprocessing import Process import os import time def test1(interval): print("test1子進程運行中,pid=%d,父進程:%d"%(os.getpid(),os.getppid())) t_start=time.time() time.sleep(interval) t_end=time.time() print("test1執行時間:%0.2f秒"%(t_end-t_start)) def test2(interval): print("test2子進程運行中,pid=%d,父進程:%d"%(os.getpid(),os.getppid())) t_start=time.time() time.sleep(interval) t_end=time.time() print("test2執行時間:%0.2f秒"%(t_end-t_start)) if __name__=="__main__": print("父進程%d"%os.getpid()) #建立進程實例,第一個參數傳要在子線程執行的函數,第二個參數傳函數須要的參數 p1=Process(target=test1,args=(1,)) p2=Process(target=test2,name="mark1",args=(2,)) #啓動進程 p1.start() p2.start() print("p2是否在運行:",p2.is_alive()) p2.join()#等待子進程運行結束再繼續執行下面語句 print("p2是否在運行:", p2.is_alive())
結果:進程
父進程15080 p2是否在運行: True test1子進程運行中,pid=15081,父進程:15080 test2子進程運行中,pid=15082,父進程:15080 test1執行時間:1.00秒 test2執行時間:2.00秒 p2是否在運行: False