守護執行緒

Ligo6發表於2024-05-29

【一】主執行緒死亡,子執行緒未死亡

  • 主執行緒結束執行後不會馬上結束,而是等待其他非守護子執行緒結束之後才會結束
  • 如果主執行緒死亡就代表者主程序也死亡,隨之而來的是所有子執行緒的死亡
from threading import Thread
import time


def work(name):
    print(f'{name} is starting')
    time.sleep(2)
    print(f'{name} is ending')


def main():
    print('主程序開始了!')
    task = Thread(target=work, args=('ligo',))
    task.start()
    print('主程序結束了!')


if __name__ == '__main__':
    main()

    # 主程序開始了!
    # ligo is starting
    # 主程序結束了!
    # ligo is ending

【二】主程序死亡,子程序必死亡

from threading import Thread
import time


def work(name):
    print(f'{name} is starting')
    time.sleep(2)
    print(f'{name} is ending')


def main():
    print('主程序開始了!')
    task = Thread(target=work, args=('ligo',))
    # 開啟守護執行緒 , 主執行緒結束,子執行緒隨之結束
    task.daemon = True
    task.start()
    print('主程序結束了!')


if __name__ == '__main__':
    main()

    # 主程序開始了!
    # ligo is starting
    # 主程序結束了! 

【三】迷惑例子

# 匯入所需模組
from threading import Thread
import time


# 定義函式foo,模擬一個耗時操作
def foo():
    # 列印開始資訊
    print(f' this is foo begin')
    # 模擬耗時操作,暫停3秒
    time.sleep(3)
    # 列印結束資訊
    print(f' this is foo end')


# 定義另一個函式func,同樣模擬耗時操作
def func():
    # 列印開始資訊
    print(f' this is func begin')
    # 模擬耗時操作,暫停1秒
    time.sleep(1)
    # 列印結束資訊
    print(f' this is func end')


# 主函式
def main():
    # 建立執行緒 task_foo ,目標函式為foo
    task_foo = Thread(target=foo)
    # 設定 task_foo 為守護執行緒
    # 意味著當主執行緒結束時,不論 task_foo 是否執行完畢都會被強制終止
    task_foo.daemon = True
    # 建立執行緒 task_func ,目標函式為func
    task_func = Thread(target=func)

    # 啟動執行緒 task_foo
    task_foo.start()
    # 啟動執行緒 task_func
    task_func.start()

    # 主執行緒繼續執行,列印以下資訊
    print(f' this is main')


# 程式入口
if __name__ == '__main__':
    main()
    #  this is main begin 
    #  this is foo begin
    #  this is func begin
    #  this is main end
    #  this is func end

相關文章