等待进程直到所有子进程完成? [复制]

Posted

技术标签:

【中文标题】等待进程直到所有子进程完成? [复制]【英文标题】:wait process until all subprocess finish? [duplicate] 【发布时间】:2013-02-27 08:50:08 【问题描述】:

我有一个创建两个或多个子进程的主进程,我希望主进程等到所有子进程完成操作并退出?

 # main_script.py

 p1 = subprocess.Popen(['python script1.py']) 
 p2 = subprocess.Popen(['python script2.py'])
 ... 
 #wait main process until both p1, p2 finish
 ...

【问题讨论】:

使用等待方式:p1.wait(); p2.wait() 看看这个问题:***.com/questions/6341358/… ***.com/questions/100624/… 顺便说一句,Popen(['python script1.py']) 不起作用。要么做Popen(['python', 'script1.py'])(首选)或Popen('python script1.py', shell=True) 不是重复的——链接的重复是专门针对 Windows 的。 【参考方案1】:

Popen 对象有一个专门为此定义的 .wait() 方法:等待给定子进程的完成(此外,重新调整其退出状态)。

如果你使用这种方法,你可以防止进程僵尸停留太久。

(或者,您可以使用subprocess.call()subprocess.check_call() 进行调用和等待。如果您不需要进程的IO,那可能就足够了。但这可能不是一个选项,因为如果您有两个子进程似乎应该并行运行,但它们不会并行运行 (call()/check_call().)

如果你有几个子流程要等待,你可以这样做

exit_codes = [p.wait() for p in p1, p2]

所有子进程完成后立即返回。然后,您将获得一个返回代码列表,您可以对其进行评估。

【讨论】:

问题是如何等待所有子进程,而不仅仅是一个。 @GregWard 如果我等待几件事,我可以依次等待。尤其是在这种情况下。 而且我不认为仅仅缺少这个细节会导致答案无用。 @antred 然后您应该调用.wait() 并使用(相当小的)超时并处理结果。 AFAIR,如果上述进程尚未终止,则返回 None,如果已终止,则返回一个数字。 @glglgl 是的,这可行,虽然我想避免主动轮询,但我想可能没有办法解决它(我在 Windows 机器上)。此外,显然在这里问和回答了同样的事情:***.com/questions/100624/…【参考方案2】:
subprocess.call

自动等待,也可以使用:

p1.wait()

【讨论】:

以上是关于等待进程直到所有子进程完成? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

父进程工作直到子进程完成

主进程或者主线程是否会等待子线程或子进程的问题

APUE第八章-进程控制

ruby 等待所有分叉的子进程完成

尽管收获,父母不会等待子进程完成

Python - 调用 perl 作为子进程 - 等待完成其后台进程并打印到 shell