在Python文档中 它说:
线程可以标记为"守护程序线程".这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出.初始值继承自创建线程.
有没有人更明确地解释这意味着什么或一个实际的例子显示你想要将线程设置为何处daemonic
?
为我澄清一下:
因此,如果您希望它们在主线程退出后继续运行,那么您唯一不会将线程设置为守护程序的时间是?
有些线程执行后台任务,例如发送keepalive数据包,或执行定期垃圾收集等等.这些仅在主程序运行时才有用,并且一旦其他非守护程序线程退出就可以将它们终止.
如果没有守护程序线程,您必须跟踪它们,并在程序完全退出之前告诉它们退出.通过将它们设置为守护程序线程,您可以让它们运行并忘记它们,当程序退出时,任何守护程序线程都会自动终止.
假设您正在制作某种仪表板小部件.作为此项的一部分,您希望它在您的电子邮箱中显示未读邮件计数.所以你做了一个小线程:
连接到邮件服务器,询问您有多少条未读邮件.
使用更新的计数向GUI发送信号.
睡了一会儿.
当您的小部件启动时,它将创建此线程,将其指定为守护程序,然后启动它.因为它是一个守护进程,你不必考虑它; 当您的小部件退出时,该线程将自动停止.
其他海报给出了一些使用守护程序线程的例子.但是,我的建议是永远不要使用它们.
这不是因为它们没用,而是因为如果使用它们会有一些不良副作用.在Python运行时开始拆除主线程中的事情后,守护程序线程仍然可以执行,从而导致一些非常奇怪的异常.
更多信息:
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343699.html
严格来说,你永远不需要它们,它只是在某些情况下使实现更容易.
考虑它的一种更简单的方法,可能是:当main返回时,如果仍存在非守护程序线程,则进程将不会退出.
一些建议:当涉及线程和同步时,干净关闭很容易出错 - 如果可以避免,请执行此操作.尽可能使用守护程序线程.
Chris已经解释了守护线程是什么,所以让我们来谈谈实际用法.许多线程池实现为任务工作者使用守护程序线程.工作者是从任务队列执行任务的线程.
工作人员需要无限期地等待任务队列中的任务,因为他们不知道何时会出现新任务.分配任务的线程(比如主线程)只知道任务何时结束.主线程等待任务队列变空,然后退出.如果worker是用户线程,即非守护进程,程序将不会终止.它将继续等待这些无限期运行的工人,即使工人没有做任何有用的事情.标记工作者守护程序线程,主线程将在处理完任务后立即将其杀死.
引用克里斯:"......当你的程序退出时,任何守护程序线程都会自动被杀死." 我认为这总结了一下.使用它们时应该小心,因为它们在主程序执行完成时突然终止.