gpt4 book ai didi

python - 多进程守护进程不在父退出时终止

转载 作者:太空狗 更新时间:2023-10-29 17:48:11 25 4
gpt4 key购买 nike

我有一个 Python 2.7 多处理进程,它不会在父进程退出时退出。我已经设置了守护进程标志,它应该强制它在父进程结束时退出。文档指出:

“当一个进程退出时,它会尝试终止它所有的守护进程。”

p = Process(target=_serverLaunchHelper, args=args)
p.daemon = True
print p.daemon # prints True
p.start()

当我通过 kill 命令终止父进程时,守护进程保持事件状态并运行(在下次运行时阻塞端口)。子进程正在启动一个 SimpleHttpServer 并调用 serve_forever 而不做任何其他事情。我的猜测是,文档的“尝试”部分意味着阻塞的服务器进程正在停止进程死亡,并因此让进程成为孤立的。我可以让子进程将服务推送到另一个线程并让主线程检查父进程 ID 的更改,但这似乎有很多代码只是为了复制守护进程功能。

是否有人了解为什么守护进程标志没有按描述工作?这在 windows8 64 位和 ubuntu12 32 位 vm 上是可重复的。

流程函数的简化版本如下:

def _serverLaunchHelper(port)
httpd = SocketServer.TCPServer(("", port), Handler)
httpd.serve_forever()

最佳答案

When a process exits, it attempts to terminate all of its daemonic child processes.

这里的关键词是“尝试”。还有,“退出”。

根据您的平台和实现,终止守护进程的唯一方法可能是明确地这样做。如果父进程正常退出,它就有机会明确退出,所以一切都很好。但如果父进程突然终止,则不会。

特别是对于 CPython,如果您查看 the source ,终止守护进程的处理方式与加入非守护进程的处理方式相同:通过在 atexit 中遍历 active_children()功能。因此,当且仅当您的 atexit 处理程序开始运行时,您的守护进程才会被终止。而且,正如该模块的文档所说:

Note: the functions registered via this module are not called when the program is killed by a signal not handled by Python, when a Python fatal internal error is detected, or when os._exit() is called.

根据您终止父进程的方式,您可以通过添加一个信号处理程序来拦截突然终止来解决这个问题。但你可能不会——例如,在 POSIX 上,SIGKILL 是不可拦截的,所以如果你 kill -9 $PARENTPID,这不是一个选项。

另一种选择是终止进程组,而不仅仅是父进程。例如,如果你的 parent 有 PID 12345,Linux 上的 kill -- -12345 将杀死它和它的所有 child (假设你没有做任何花哨的事情)。

关于python - 多进程守护进程不在父退出时终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15887994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com