调用 daemon=True 可将线程设为守护线程,使其随主线程退出而强制终止;必须在 start() 前设置,且不可更改;守护线程不保证清理逻辑执行,非守护线程则会阻塞主线程退出。

在 Python 多线程中,调用 setDaemon(True)(或更推荐的 daemon = True)可将线程设为守护线程,使其在主线程退出时自动终止,无需显式等待。
守护线程的核心行为
守护线程不会阻止程序退出。当主线程结束,所有守护线程会被强制终止(不执行 finally 块、不保证清理逻辑完成),而普通(非守护)线程会阻塞主线程退出,直到自己运行完毕(除非被主动中断)。
两种设置方式(推荐后者)
Python 3.3+ 推荐使用属性赋值方式,更清晰且兼容 future 版本:
-
方式一(旧式):创建线程后、启动前调用
t.setDaemon(True) -
方式二(推荐):初始化时直接指定
daemon=True,例如:t = threading.Thread(target=work, daemon=True)
关键注意事项
必须在 t.start() 之前设置 daemon 属性,否则会抛出 RuntimeError。守护线程无法再改为非守护,反之亦然。
常见误用场景:
- 忘记设 daemon,导致主线程因子线程未结束而卡住
- 在
start()后调用setDaemon(),引发异常 - 依赖守护线程完成文件写入或日志落盘——它可能被突然中止,数据丢失
简单示例
以下代码中,守护线程每秒打印一次,但主线程 3 秒后就退出,子线程随之消失:
import threading
import time
<p>def background_task():
for i in range(10):
print(f"守护线程: {i}")
time.sleep(1)</p><p>t = threading.Thread(target=background_task, daemon=True)
t.start()
time.sleep(3) # 主线程 3 秒后结束
print("主线程退出")
输出通常只显示 0、1、2 或 0、1、2、3,具体取决于调度时机,但绝不会等到 9。

















