1. 程式人生 > >7.3.4 - 並發多線程 守護線程

7.3.4 - 並發多線程 守護線程

結果 sed clas 圖片 none src opened 技術 blog

一 守護線程

無論是進程還是線程,都遵循:守護xxx會等待主xxx運行完畢後被銷毀

需要強調的是:運行完畢並非終止運行

1、對主進程來說,運行完畢指的是主進程代碼運行完畢

2、對主線程來說,運行完畢指的是主線程所在的進程內所有非守護線程統統運行完畢,主線程才算運行完畢

詳細解釋:

1、主進程在其代碼結束後就已經算運行完畢了(守護進程在此時就被回收),然後主進程會一直等非守護的子進程都運行完畢後回收子進程的資源(否則會產生僵屍進程),才會結束,

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

if __name__ == __main__:
    t1=Thread(target=foo)
    t2=Thread(target=bar)

    t1.daemon=True
    t1.start()
    t2.start()
    
print("main-------")
技術分享圖片
123
456
main-------
end123
end456
運行結果

1. t1.start() 會打印 123

2. t2.start()會打印456

3. print("main-------") 會打印main-------

此時主線程在等待其他非守護進程結束後才結束

7.3.4 - 並發多線程 守護線程