Python线程中守护线程属性的含义

83 投票
3 回答
104306 浏览
提问于 2025-04-16 07:54

我对把线程设置为守护线程有点困惑。

文档上是这么说的:

一个线程可以被标记为“守护线程”。这个标记的意思是,当只剩下守护线程时,整个Python程序会退出。这个标记的初始值是从创建它的线程那里继承来的。可以通过daemon属性来设置这个标记。

我不太明白这和普通线程有什么不同。

这是不是说这个程序永远不会结束?

def threadfunc():
    while True:
        time.sleep(1)

threading.Thread(target=threadfunc).start()

即使主线程完成了它的执行,守护线程会立即结束吗?

def threadfunc():
    while True:
        time.sleep(1)

th = threading.Thread(target=threadfunc)
th.daemon = True
th.start()

我问这个是因为在我的主线程中调用了sys.exit(),但程序却卡住了,我可以在日志中看到其他线程还在运行。

这和在有线程活着的情况下调用sys.exit()有关吗?

3 个回答

7
th.daemon = True #set this thread as a Daemon Thread

你可以把守护线程想象成一种服务,这意味着它会在你电脑的后台运行,执行各种任务,比如索引文件、解析xml、获取新闻等等,任何需要长时间运行的过程。

你的主线程会结束,而守护线程仍然在后台运行。这就是为什么你的程序(也就是主线程)结束后,守护线程还在继续工作的原因。如果你想让它一直运行,只需放一个无限循环,你就会看到这个线程还在运行。

一个守护线程的例子就是垃圾回收。

22

thread.daemon = True 设为真,可以让主程序直接退出。通常情况下,应用程序会等所有的子线程都完成后才会结束。

55

这是不是在说这个程序永远也不会结束?

没错,这个程序是不会结束的,试试看就知道了。

我问这个是因为我在主线程里调用了 sys.exit(),结果程序就卡住了, 而我的其他线程还在运行,我 可以从日志中看到它们在工作。这 和调用 sys.exit() 时还有线程在 活着有关系吗?

是的,即使是 exit 也不会停止其他线程,它只是让主线程抛出 SystemExit。所以主线程会停止(就像遇到其他未处理的异常时一样),但是所有其他非守护线程会继续运行。

撰写回答