基于Python documentation ,守护线程是一旦主线程死亡就死亡的线程。这似乎与守护进程的行为完全相反,守护进程涉及创建子进程并终止父进程,以便让 init 接 pipe 进程(即杀死父进程不会杀死子进程)。
那么为什么守护线程会在父线程死亡时死亡,这是用词不当吗?我认为“守护进程”线程将在主进程终止后继续运行。
最佳答案
这只是名称在不同的上下文中具有不同的含义。
如果您不知道,像 threading.Thread
一样,multiprocessing.Process
也可以被标记为“守护进程”。您对“守护进程”的描述适合 Unix 守护进程,而不适合 Python 的守护进程。
文档还有一个关于 Process.daemon
的部分:
... Note that a daemonic process is not allowed to create child processes. Otherwise a daemonic process would leave its children orphaned if it gets terminated when its parent process exits. Additionally, these are not Unix daemons or services, they are normal processes that will be terminated (and not joined) if non-daemonic processes have exited.
Python 守护进程和 Unix 守护进程(或 Windows“服务”)之间唯一的共同点是您将它们用于后台任务 (对于 Python:不过,仅适用于不需要在关闭时进行适当清理的任务的选项)。
Python 在操作系统线程和进程之上强加了自己的抽象层。 Thread
和 Process
的守护进程属性是关于这个独立于操作系统的 Python 级抽象。
在Python级别,守护线程是一个在主线程退出时不会加入(等待自动退出)的线程,而守护进程是一个在以下情况下终止(未加入)的进程:父进程退出。守护线程和进程都经历相同的行为,因为如果主进程或父进程关闭,则不会等待它们的自然退出。仅此而已。
注意,Windows甚至没有像Unix那样的“相关进程”的概念,但Python以跨平台的方式实现了这种“子”和“父”关系。
I would think that "daemon" threads would keep running after the main process has been terminated.
线程不能存在于进程之外。进程始终托管至少一个线程并为其提供上下文。
关于python - Python 中的守护线程与守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222905/