一、守護進程
1.1、什麼是守護進程?
1、守護進程會在主進程代碼運行結束的情況下,立即掛掉。
2、守護進程本身就是一個子進程。
3、主進程在其代碼結束後就已經算運行完畢了(守護進程在此時就被回收),然後主進程會一直等非守護的子進程都運行完畢後回收子進程的資源(否則會產生殭屍進程),纔會結束,
1.2、爲什麼要用守護進程?
1、守護進程本身就是一個子進程,所以在主進程需要將任務併發執行的時候需要開啓子進程。
2、當該子進程執行的任務生命週期伴隨着主進程的生命週期時,就需要將該子進程做成守護進程。1.3、如何使用守護進程?
1.例子:
from multiprocessing import Process import os import time def task(x): print('%s is running ' %x) time.sleep(3) print('%s is done' %x) if __name__ == '__main__': p1=Process(target=task,args=('守護進程',)) p2=Process(target=task,args=('子進程',)) p1.daemon=True # 設置p1爲守護進程 p1.start() p2.start() print('主') >>:主 >>:子進程 is running >>:子進程 is done
這裏可看出,當主進程的代碼運行完畢後,守護進程就會立馬結束掉。而不會去管其他子進程是否運行完畢。
二、守護線程
2.1、什麼是守護線程?
1、守護線程會在"該進程內所有非守護線程全部都運行完畢後,守護線程纔會掛掉"。並不是主線程運行完畢後守護線程掛掉。這一點是和守護進程的區別之處!
2、守護線程守護的是:當前進程內所有的子線程!
3、主線程在其他非守護線程運行完畢後纔算運行完畢(守護線程在此時就被回收)。因爲主線程的結束意味着進程的結束,進程整體的資源都將被回收,而進程必須保證非守護線程都運行完畢後才能結束。
2.2、主線程與進程的關係
1、主線程的生命週期就是一個進程的生命週期
2、主進程等待子進程是因爲主進程要負責回收子進程的系統資源,主線程等待子線程是因爲主線程要等待子線程運行完畢(子線程運行完畢後,這個進程纔算運行完畢)後,主線程才結束。
2.3、如何使用守護線程?
1.例子:當只有一個子線程並且爲守護線程,那麼這個守護線程就會等待主線程運行完畢後掛掉
from threading import Thread import os import time def task(x): print('%s is running ' %x) time.sleep(3) print('%s is done' %x) if __name__ == '__main__': t1=Thread(target=task,args=('守護線程',)) t1.daemon=True # 設置p1爲守護進程 t1.start() print('主') >>:守護線程 is running >>:主
2.例子:當有多個子線程時,守護線程就會等待所有的子線程運行完畢後,守護線程纔會掛掉(這一點和主線程是一樣的,都是等待所有的子線程運行完畢後纔會掛掉)。
from threading import Thread import time def foo(): print(123) time.sleep(1) print("end123") def bar(): print(456) time.sleep(3) print("end456") t1=Thread(target=foo) t2=Thread(target=bar) t1.daemon=True t1.start() t2.start() print("main-------") >>:123 >>:456 >>:main------- >>:end123 >>:end456