Python 守護程序與守護執行緒
一、守護程序
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