在python 2.7中,如果程序master
使用subprocess.Popen启动subprocess
然后退出,subprocess
将继续运行。我认为这一般与流程处理一致,至少对于* nix。
这似乎意味着如果我的一些subprocess
程序永远运行并且我杀了master
,则子进程将继续运行。那是对的吗? (我问,因为杀死一个进程的行为可能不同于简单地让它自行退出)。
在关于命令shell(不是Python)的StackOverflow条目中,提到能够创建一个实际上将在其创建者进程终止时终止的子进程。他们似乎被称为" daemonic"流程。
是否有类似的方法可以在Python中自动执行此操作?也就是说,有没有办法可以使用subprocess.Popen或其他方法来启动一个子进程,如果父进程死掉会自动死掉?
子进程非常不同,因此无法选择线程。
答案 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()
你当然可以通过等待超时然后终止来获得更好的,或者只是终止它们而不试图先杀死,或发送不同的信号,或者......你想要的任何东西。但这是基本的想法。
在某些情况下,使用带有ExitStack
的with
语句可以更好地将子项添加到创建时。
另一方面,在一些复杂的脚本中,从顶层访问孩子真的没有好办法,你必须使用像atexit
处理程序这样的东西。
但还有另一种经常有效的简单设计。如果你没有运行太多的孩子,你可以在每个孩子上只生成一个帖子wait
,甚至只产生run
个帖子,而不是创建Popen
。如果你运行了很多孩子,单个线程可以通过它们等待超时来循环,虽然这可能会更加繁琐(如果你不这样做会浪费资源)。然后,这只是管理你的线程的问题,他们会自动管理你的孩子。