【一】主執行緒死亡,子執行緒未死亡
- 主執行緒結束執行後不會馬上結束,而是等待其他非守護子執行緒結束之後才會結束
- 如果主執行緒死亡就代表者主程序也死亡,隨之而來的是所有子執行緒的死亡
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