等待进程直到所有子进程完成? [复制]
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()
【讨论】:
以上是关于等待进程直到所有子进程完成? [复制]的主要内容,如果未能解决你的问题,请参考以下文章