在Python文档中 它说:

一个线程可以被标记为“守护线程”。这其中的意义 标志表示当只有守护进程线程时,整个Python程序退出 是离开了。初始值继承自创建的线程。

有人对这意味着什么有更清楚的解释吗?或者有一个实际的例子说明在哪里将线程设置为守护线程?

澄清它为我:所以唯一的情况下,你不会设置线程为守护进程,是当你想让他们继续运行后,主线程退出?


当前回答

假设您正在制作某种仪表板小部件。作为此功能的一部分,您希望它在电子邮件框中显示未读邮件计数。所以你做了一个小线,它将:

连接到邮件服务器并询问有多少未读邮件。 用更新后的计数向GUI发出信号。 睡一会儿。

当您的小部件启动时,它将创建这个线程,将其指定为守护进程,然后启动它。因为它是一个守护进程,你不需要考虑它;当您的小部件退出时,线程将自动停止。

其他回答

当第二个线程不是daemon线程时,应用程序的主主线程不能退出,因为它的退出条件也绑定到非daemon线程的退出。在python中线程不能被强制杀死,因此你的应用程序将不得不等待非daemon线程退出。如果这种行为不是您想要的,那么将第二个线程设置为守护进程,这样它就不会阻止应用程序退出。

引用克里斯的话:“……当您的程序退出时,所有守护进程线程将自动被杀死。”我想这就是总结。在使用它们时要小心,因为当主程序执行到完成时,它们会突然终止。

其他帖子给出了一些使用守护进程线程的示例。然而,我的建议是永远不要使用它们。

这并不是因为它们没有用处,而是因为如果你使用它们,你会经历一些不好的副作用。在Python运行时开始删除主线程中的内容之后,守护线程仍然可以执行,从而导致一些非常奇怪的异常。

更多信息:

https://joeshaw.org/python-daemon-threads-considered-harmful/

https://mail.python.org/pipermail/python-list/2005-February/343697.html

严格地说,你永远不需要它们,它只是在某些情况下使实现更容易。

也许可以用一种更简单的方式来考虑:当main返回时,如果有非守护进程线程仍在运行,则您的进程将不会退出。

一点建议:当涉及线程和同步时,干净关机很容易出错——如果可以避免,就这样做。尽可能使用守护线程。

假设您正在制作某种仪表板小部件。作为此功能的一部分,您希望它在电子邮件框中显示未读邮件计数。所以你做了一个小线,它将:

连接到邮件服务器并询问有多少未读邮件。 用更新后的计数向GUI发出信号。 睡一会儿。

当您的小部件启动时,它将创建这个线程,将其指定为守护进程,然后启动它。因为它是一个守护进程,你不需要考虑它;当您的小部件退出时,线程将自动停止。