Python 中的守护线程与守护进程

Daemon threads vs daemon processes in Python

基于Python documentation,守护线程是在主线程死亡后死亡的线程。这似乎是守护进程的完全相反的行为,守护进程涉及创建子进程并终止父进程以使 init 接管子进程(也就是杀死父进程不会杀死子进程)。

那么为什么守护线程会在父线程死亡时死亡,这是用词不当吗?我认为 "daemon" 线程会在 主进程终止后保持 运行

这只是名称在不同的上下文中有不同的含义。

如果你不知道,像threading.Threadmultiprocessing.Process也可以标记为"daemon"。您对 "daemon processes" 的描述适合 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 "Services")之间唯一的共同点是你会 使用 它们用于后台任务 (对于 Python:不过,对于不需要在关机时进行适当清理的任务,这只是一个选项)。

Python 在 OS 线程和进程之上强加了它自己的抽象层。 ThreadProcess 的守护进程属性是关于这个 OS-独立、Python 级抽象。

在Python级别,守护线程是一个在主线程退出时没有加入(等待自动退出)的线程,而守护进程是一个进程当父进程退出时终止(未加入)。守护线程和进程都经历相同的行为,因为在主进程或父进程关闭时不会等待它们的自然退出。就这些了。

注意Windows连Unix中的"related processes"的概念都没有,但是Python实现了"child"和"parent"的这种关系跨平台方式。

I would think that "daemon" threads would keep running after the main process has been terminated.

线程不能存在于进程外部。一个进程始终承载 至少 一个线程并为其提供上下文。