一 : 概述
進程由三部分組成 : 代碼段,數據段,PCB(進程控制塊)
Python中的進程編程依賴於multiprocessing這個包,其中Process類就是提供最基礎的功能的類
二 : 使用Process類創建進程
使用Process類可以創建新的進程,有兩種使用方法:
1.實例化Process類,參數如下:
group參數未使用,值始終為None;
target表示調用對象,即子進程要執行的任務,也就是方法名,不是字符串形式,也不帶括號;
args表示調用對象的位置參數元組,args=(1,2,'egon',);
kwargs表示調用對象的字典,kwargs={'name':'egon','age':18};
name為子進程的名稱.
這種方法需要先寫好一個方法,作為參數傳入Process實例化時候調用的__init__()方法
def func(i):
time.sleep(1)
print('這里是子進程')
if __name__ == '__main__':
p = Process(target=func, args=(1,)) # 實例化一個進程對象
p.start() # 開啟一個子進程
print('這里是父進程')
# 結果:
# 這里是父進程
# 這里是子進程
2.新寫一個Process類的子類,初始化直接調用父類的初始化方法,自己實現一個名為run()的方法,這個方法提供的作用相當於方法1中提前寫好的那個方法
class MyProcess(Process): def __init__(self): super(MyProcess, self).__init__() def run(self): print('這是以繼承類的方式開啟的子進程') if __name__ == '__main__': p1 = MyProcess() p1.start() # 結果: # 這是以繼承類的方式開啟的子進程
三 : 進程對象的使用
創建進程(進程類實例化)之后,需要調用start()方法啟動它,我們知道,一個進程啟動之后到銷毀之前,有三種狀態:就緒/阻塞/運行,調用該方法之后,進程就會進入就緒狀態,等待操作系統給它分配時間片.
其他方法介紹:
run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法;
terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵屍進程,使用該方法需要特別小心這種情況。如果p還保存了一個鎖那么也將不會被釋放,進而導致死鎖
is_alive():如果p仍然運行,返回True
join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的進程,而不能join住run開啟的進程
run()和start()的糾葛:
start()方法調用的就是run()方法,但是start()只是讓進程處於就緒狀態,run()則是讓進程進入運行狀態,大約相當於start()+join()的效果,所以run()之后也不會再調用join().
常用屬性:
name : 給進程一個名字;
pid : 進程的pid
daemon : 默認為False,當為True時,該進程為守護進程
四 : 守護進程
特點 : 1.守護進程隨着父進程的結束而結束,普通子進程運行完父進程才會結束,即使父進程代碼塊已經運行完畢.
2.守護進程不能再創建子進程.
創建 : 將實例化出的進程對象的daemon屬性設定為True即可,該語句需要在start()語句之前.
