守护线程说明

在Python文档中说:

一个线程可以被标记为“守护线程”。 这个标志的意义在于,只有守护进程线程被留下时,整个Python程序才会退出。 初始值是从创build线程inheritance的。

有没有人有一个更清楚的解释是什么意思或一个实际的例子,显示你想要设置线程为daemonic


为了澄清我:

所以唯一不会将线程设置为守护进程的方法是在主线程退出后让它们继续运行。

一些线程执行后台任务,例如发送Keepalive数据包,或执行定期垃圾回收等。 这些仅在主程序运行时才有用,一旦其他非守护进程线程退出,就可以将其closures。

没有守护进程线程,你必须跟踪他们,并告诉他们退出,在你的程序可以完全退出之前。 通过将它们设置为守护进程线程,可以让它们运行并忘记它们,当程序退出时,任何守护进程线程都会自动终止。

假设您正在制作某种仪表板小部件。 作为其中的一部分,您希望它在邮箱中显示未读的邮件数量。 所以你做一个小线程将会:

  1. 连接到邮件服务器,询问你有多less条未读邮件。
  2. 用更新的计数来标示GUI。
  3. 睡一会儿。

当你的小部件启动时,它会创build这个线程,指定它为一个守护进程,并启动它。 因为这是一个守护进程,所以你不必考虑它。 当你的小部件退出时,线程将自动停止。

一个更简单的方法来思考它,也许:当主返回时,如果有非守护线程仍在运行,你的进程将不会退出。

一些build议:当涉及到线程和同步时,干净closures很容易出错 – 如果可以避免的话,那么这样做。 尽可能使用守护进程线程。

其他海报给出了一些使用守护进程线程的例子。 然而,我的build议永远不会使用它们。

这不是因为它们没有用处,而是因为如果你使用它们,可能会遇到一些不好的副作用。 守护进程线程仍然可以在Python运行时开始拆除主线程中的东西之后执行,导致一些相当奇怪的exception。

更多信息:

http://joeshaw.org/2009/02/24/605

http://mail.python.org/pipermail/python-list/2005-February/307042.html

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

Chris已经解释了守护线程,所以让我们来谈谈实际的使用。 许multithreading池实现为任务工作者使用守护进程线程。 工作人员是从任务队列执行任务的线程。

工作人员需要无限期地等待任务队列中的任务,因为他们不知道什么时候会出现新的任务。 分配任务的线程(比如主线程)只知道任务何时结束。 主线程在任务队列上等待变空,然后退出。 如果worker是用户线程,即非守护进程,程序将不会终止。 即使工人没有做任何有用的事情,他们也会继续等待这些无限期地工作的工人。 标记worker守护进程线程,主线程会在完成处理任务后立即处理它们。

引用Chris的话:“当你的程序退出时,任何守护线程都会自动被终止。” 我认为这是总结。 当主程序执行完成时,你应该小心使用它们,因为它们会突然终止。