Python 子线程或进程可以在父进程中存活的线程或进程模型?
Python thread or process model where child thread or process can survive parent?
这是一个设计问题,参考了 python 使用线程与多进程的脚本。据我了解,使用线程模块生成线程无法在父线程(即进程)终止后继续存在。父线程必须执行连接(即等待超时不能承受)或退出,如果没有连接,则在父线程退出时终止子线程。这是由于线程的共享资源模型,对吧?
而多处理模块在生成进程时可以存活,即继续完成,而不管创建它的父进程是否退出或终止。当然,这假设父进程从未为子进程调用完成的连接。
threading
和 multiprocessing
都旨在实现程序内的并行性。他们的目标不是启动独立的进程。因此,这两个包在准备解释器关闭期间隐式终止了它们的并行执行路径。
线程是进程的子集,它们不能超过创建它们的进程。
在 Python 解释器生命周期的终结例程中,在解释器关闭时使用函数 _shutdown()
in the threading module. This function is called 隐式连接活动的非守护线程。
守护线程简单地以解释器进程结束。
如果通过 multiprocessing
创建的进程在解释器准备关闭时仍然存在,它们将被 _exit_function()
, that has been registered as exit handler via atexit 终止。类似于 threading
,multiprocessing
加入非守护进程 child 进程;在守护进程 childs 上,terminate()
被调用。
如果您想从 Python 程序启动进程并在之后退出该程序,请使用 subprocess.Popen
. If you are on a POSIX platform, you might also want to take a look at python-daemon
。
这是一个设计问题,参考了 python 使用线程与多进程的脚本。据我了解,使用线程模块生成线程无法在父线程(即进程)终止后继续存在。父线程必须执行连接(即等待超时不能承受)或退出,如果没有连接,则在父线程退出时终止子线程。这是由于线程的共享资源模型,对吧?
而多处理模块在生成进程时可以存活,即继续完成,而不管创建它的父进程是否退出或终止。当然,这假设父进程从未为子进程调用完成的连接。
threading
和 multiprocessing
都旨在实现程序内的并行性。他们的目标不是启动独立的进程。因此,这两个包在准备解释器关闭期间隐式终止了它们的并行执行路径。
线程是进程的子集,它们不能超过创建它们的进程。
在 Python 解释器生命周期的终结例程中,在解释器关闭时使用函数 _shutdown()
in the threading module. This function is called 隐式连接活动的非守护线程。
守护线程简单地以解释器进程结束。
如果通过 multiprocessing
创建的进程在解释器准备关闭时仍然存在,它们将被 _exit_function()
, that has been registered as exit handler via atexit 终止。类似于 threading
,multiprocessing
加入非守护进程 child 进程;在守护进程 childs 上,terminate()
被调用。
如果您想从 Python 程序启动进程并在之后退出该程序,请使用 subprocess.Popen
. If you are on a POSIX platform, you might also want to take a look at python-daemon
。