|
1
500
一些线程执行后台任务,比如发送保活数据包,或执行定期垃圾收集,等等。这些只有在主程序运行时才有用,一旦其他非守护进程线程退出,就可以杀死它们。 如果没有守护进程线程,您必须跟踪它们,并告诉它们退出,然后程序才能完全退出。通过将它们设置为守护进程线程,您可以让它们运行并忘记它们,当您的程序退出时,任何守护进程线程都会自动终止。 |
|
|
2
32
假设你正在制作某种仪表板小部件。作为其中的一部分,您希望它在您的电子邮件框中显示未读邮件数。所以你做一个小线程,它会:
当你的小部件启动时,它会创建这个线程,将其指定为守护进程,然后启动它。因为它是一个守护进程,你不必考虑它;当您的小部件退出时,线程将自动停止。 |
|
|
3
19
也许有一种更简单的思考方式:当main返回时,如果还有非守护进程线程仍在运行,您的进程将不会退出。 一点建议:当涉及线程和同步时,干净关机很容易出错——如果可以避免的话,就这样做。尽可能使用守护进程线程。 |
|
|
4
18
其他海报给出了一些使用守护进程线程的情况的例子。然而,我的建议是永远不要使用它们。 这并不是因为它们没有用,而是因为如果你使用它们,你会遇到一些不良的副作用。在Python运行时开始拆除主线程中的东西后,守护进程线程仍然可以执行,从而导致一些非常奇怪的异常。 更多信息请点击此处: https://joeshaw.org/python-daemon-threads-considered-harmful/ https://mail.python.org/pipermail/python-list/2005-February/343697.html 严格来说,你永远不需要它们,它只是在某些情况下使实现更容易。 |
|
|
5
12
我还将在这里添加一些内容,我认为守护进程线程让大多数人感到困惑的原因之一(至少对我来说是这样)是因为这个词的Unix上下文
在Unix术语中,这个词
在Python线程上下文中,创建时的每个线程都在后台运行,无论是
当你开始一个
具有
需要注意的一点是,你应该清楚自己在做什么
另一件令人困惑的事情
简单地说,这意味着如果你的程序既有
|
|
|
6
11
引用Chris的话:“…当你的程序退出时,任何守护进程线程都会自动被杀死。”。我认为这概括了这一点。使用它们时应该小心,因为当主程序执行完毕时,它们会突然终止。 |
|
|
7
7
Chris已经解释了守护进程线程是什么,所以让我们谈谈实际用法。许多线程池实现为任务工作者使用守护进程线程。Workers是执行任务队列中任务的线程。 工作人员需要无限期地等待任务队列中的任务,因为他们不知道新任务何时出现。分配任务的线程(比如主线程)只知道任务何时结束。主线程等待任务队列变空,然后退出。若workers是用户线程,即非守护进程,程序将不会终止。它将继续等待这些无限期运行的工人,即使工人没有做任何有用的事情。标记workers守护进程线程,主线程在处理完任务后会立即杀死它们。 |
|
|
8
4
当你的第二个线程不是守护进程时,你的应用程序的主线程无法退出,因为它的退出条件也与非守护进程线程的退出相关联。python中不能强制杀死线程,因此您的应用程序必须真正等待非守护进程线程退出。如果这种行为不是你想要的,那么将你的第二个线程设置为守护进程,这样它就不会阻止你的应用程序退出。 |