python子流程.popen父程序退出时终止子程序?

2024-04-25 23:34:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这似乎意味着,如果我的某些subprocess程序永远运行,而我杀死master,则子进程将继续运行。对吗?(我之所以问这个问题,是因为有可能终止一个进程,而不仅仅是让它自动退出)。在

在关于命令shell(而不是Python)的StackOverflow条目中,提到了能够创建一个子进程,如果其创建者进程死亡,该子进程实际上将终止。它们似乎被称为“守护进程”。在

在Python中有没有类似的方法可以自动实现这一点?也就是说,我有没有办法子流程.Popen或者另一种方法来启动子进程,如果父进程死了,该子进程将自动终止?在

子进程非常不同,因此不能选择线程。在


Tags: 方法命令程序master进程过程nix条目
1条回答
网友
1楼 · 发布于 2024-04-25 23:34:15

术语“daemon”在这里可能更令人困惑而不是有用。它意味着你不必等待/加入。对于线程,这实际上意味着一个线程将在退出时被隐式终止,但对于子进程,它意味着一个线程将在后台运行并继续运行,即使其父进程、会话、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()

当然,你可以通过等待一个超时然后终止,或者仅仅终止它们而不尝试先杀死它们,或者发送不同的信号,或者……任何你想要的。但这是最基本的想法。在

在某些情况下,使用一个with语句和一个{a1}语句更好,您可以在创建子语句时将其添加到其中。在

另一方面,在一些复杂的脚本中,确实没有从顶层访问子级的好方法,您必须使用更粗糙的方法,如^{}处理程序。在


但还有另一个简单的设计通常是有效的。如果没有运行太多的子进程,可以在每个子进程上生成一个线程wait,甚至可以只生成run而不是创建一个Popen。如果您正在运行许多子进程,那么一个线程可以在等待超时的情况下遍历这些子进程,尽管这样做可能要复杂得多(否则会浪费资源)。然后就是管理你的线程,它们会自动管理你的孩子。在

相关问题 更多 >