父prog退出时,python subprocess.popen kill subprog?

时间:2018-04-10 06:21:49

标签: python subprocess

在python 2.7中,如果程序master使用subprocess.Popen启动subprocess然后退出,subprocess将继续运行。我认为这一般与流程处理一致,至少对于* nix。

这似乎意味着如果我的一些subprocess程序永远运行并且我杀了master,则子进程将继续运行。那是对的吗? (我问,因为杀死一个进程的行为可能不同于简单地让它自行退出)。

在关于命令shell(不是Python)的StackOverflow条目中,提到能够创建一个实际上将在其创建者进程终止时终止的子进程。他们似乎被称为" daemonic"流程。

是否有类似的方法可以在Python中自动执行此操作?也就是说,有没有办法可以使用subprocess.Popen或其他方法来启动一个子进程,如果父进程死掉会自动死掉?

子进程非常不同,因此无法选择线程。

1 个答案:

答案 0 :(得分:0)

术语“守护进程”可能比这里的帮助更令人困惑。这意味着您不必等待/加入。对于一个线程,这实际上意味着一个线程将在退出时被隐式杀死 - 但是对于一个子进程,它意味着一个将在后台运行并继续这样做,即使它的父节点,它的会话,它的tty等等。都死了。 subprocess文档甚至没有提到这个术语,可能是为了避免这种混淆。

无论如何,如果您希望孩子能够自动离开父母,无论在所有平台上是什么,您都需要明确地做到这一点。

对于一个可以访问所有Popen对象的顶级脚本的漂亮设计,最简单的方法是在顶层:

if __name__ == '__main__':
    try:
        # do a bunch of stuff, including launching lots of children
    finally:
        for p in childprocs:
            p.kill()
        for p in childprocs:
            p.wait()

你当然可以通过等待超时然后终止来获得更好的,或者只是终止它们而不试图先杀死,或发送不同的信号,或者......你想要的任何东西。但这是基本的想法。

在某些情况下,使用带有ExitStackwith语句可以更好地将子项添加到创建时。

另一方面,在一些复杂的脚本中,从顶层访问孩子真的没有好办法,你必须使用像atexit处理程序这样的东西。

但还有另一种经常有效的简单设计。如果你没有运行太多的孩子,你可以在每个孩子上只生成一个帖子wait,甚至只产生run个帖子,而不是创建Popen。如果你运行了很多孩子,单个线程可以通过它们等待超时来循环,虽然这可能会更加繁琐(如果你不这样做会浪费资源)。然后,这只是管理你的线程的问题,他们会自动管理你的孩子。