2008-10-10 117 views
161

Python documentation 它说:守护线程说明

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

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


为了澄清对我来说:

所以唯一的一次不会组线程作为恶魔的是,如果你想让他们继续在主线程退出后运行?

回答

319

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

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

+11

这真的是一个了不起的解释,因为你提到了哪些现实世界的职责可以分配为守护进程线程。谢谢! – dotancohen 2013-09-02 10:33:09

+0

因此,如果我有一个正在执行文件写入操作的子线程设置为非deamon,那么这是否意味着我必须使其明确退出? – 2014-06-15 15:19:55

+3

@san写作者完成写作后,你的作家会做什么?它只是返回吗?如果是这样,那就足够了。守护进程线程通常用于循环运行的内容,不会自行退出。 – 2014-06-15 15:21:21

21

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

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

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

13

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

一些建议:当涉及到线程和同步时,干净关闭很容易出错 - 如果可以避免它,那就这样做。尽可能使用守护进程线程。

9

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

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

此处了解详情:

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

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

严格来说你永远需要他们,只是让某些情况下更容易实现。

4

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

8

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

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