Python多处理和子进程的独立性

标签 python subprocess multiprocessing children orphan

在 python 终端中,我运行如下命令来生成一个长时间运行的子进程:

from multiprocessing.process import Process
Process(target=LONG_RUNNING_FUNCTION).start()

此命令返回,我可以在 python 终端中执行其他操作,但 child 打印的任何内容仍会打印到我的 python 终端 session 中。

当我退出终端时(使用 exitCTRL+D),exit 命令挂起。如果我在此挂起期间按 CTRL+C,子进程将终止。

如果我手动终止 python 终端进程(通过 posix kill 命令),子进程将成为孤立的,并继续运行,其输出可能会被丢弃。

如果我用 python -c 运行这段代码,它会等待子进程终止,然后 CTRL+C 会杀死父进程和 child 。

当 parent 终止时,python 的哪些运行配置会杀死 child ?特别是,如果 python-mod_wsgi-apache 网络服务器生成子进程然后重新启动,这些子进程会被杀死吗?

[顺便说一句,从终端分 ionic 进程的正确方法是什么?有没有比以下更优雅的方法:Deliberately make an orphan process in python ]

更新:在 apache 下运行的网络服务器使用 multiprocessing.Process 生成的 python 子进程在 apache 重新启动时不会被杀死。

最佳答案

这不是你如何调用 python 的问题;这是 multiprocessing 的一个特点模块。当您导入该模块时,退出处理程序将添加到调用 join() 的父进程中在 Process 上通过 multiprocessing.Process 创建的所有 child 的对象在允许 parent 退出之前。如果您打算以这种方式启动子进程,那么如果不破解模块内部结构,就没有办法避免给您带来麻烦的行为。

如果你想启动一个能够比父进程存活更久的进程,那么使用 subprocess.Popen 可能会更好。 .如果 child 以这种方式开始, parent 将不会在退出前尝试加入 child ,而是立即退出,留下一个孤儿:

>>> from subprocess import Popen
>>> Popen(["sleep", "100"], start_new_session=True)
<subprocess.Popen object at 0x10d3fedd0>
>>> exit()
alp:~ $ ps -opid,ppid,command | grep sleep | grep -v grep
37979     1 sleep 100

您使用 multiprocessing 有什么特别的原因吗?而不是 subprocess ?前者不打算用于创建比父进程生命周期更长的子进程;它用于创建子进程来完成可以有效地跨 CPU 并行化的工作,作为规避 Global Interpreter Lock 的一种方式。 . (出于讨论的目的,我忽略了 multiprocessing 的分布式功能。) multiprocessing因此通常在没有 GIL 的情况下使用线程。 (请注意,在这方面,multiprocessing 模块的 API 与 threading 模块的 API 密切相关。)

关于帖子末尾的具体问题:(1)当 parent 终止时,关于 python 的任何事情都不负责杀死 child 。仅当父进程在退出前将其杀死(或者如果整个进程组都被杀死),Web 服务器的子进程才会被杀死。 (2) 您链接到的方法看起来像是在不了解这样做的标准习语的情况下试图复制守护进程。有许多用于创建守护进程的包;您应该改用其中之一。

关于Python多处理和子进程的独立性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665341/

相关文章:

python - 在Linux服务器上运行子进程不起作用,但在Windows上本地运行

python - 子进程返回代码不同于 "echo $?"

加入的 Python 进程不会调用 atexit

python-2.7 - 如何突破python shell :

Python - 在条件匹配时替换前 2 行

rust - 如何无损地传播子进程的退出代码作为我自己程序的退出代码

python - 将串行任务转换为并行以映射输入和输出

python - 使用 BeautifulSoup 进行多处理来改进 Wikipedia 抓取

python - Anaconda Python 在 Windows10 中安装 imutils

python - 无法从 Pycharm 运行 django 服务器