等待进程直到所有子进程完成?

121

我有一个主进程,它创建了两个或更多的子进程,我希望主进程等待所有子进程完成它们的操作并退出。

 # main_script.py

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

6
使用等待方法:p1.wait(); p2.wait() - catalin.costache
1
请查看以下问题:https://dev59.com/XGw15IYBdhLWcg3w4_tL - Calum
2
https://dev59.com/-nVD5IYBdhLWcg3wE3No - Gjordis
2
顺便一提,Popen(['python script1.py']) 是不起作用的。要么使用 Popen(['python', 'script1.py'])(更好的选择),要么使用 Popen('python script1.py', shell=True) - glglgl
2
不是重复 -- 链接的重复是关于Windows的。 - Will
2个回答

157

一个Popen对象有一个.wait()方法,专门用于等待给定子进程的完成(并且返回其退出状态)。

如果使用此方法,您将防止进程僵尸在系统中挂起太久。

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

如果您有多个子进程要等待,请执行以下操作:

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

如果出于语法原因,您可以使用exit_codes = [p.wait() for p in (p1, p2)],该命令会在所有子进程完成后立即返回。然后,您将获得一个返回代码列表,您可以对其进行评估。


1
如果我有一个进程列表,需要等待它们完成,但我希望当任何一个进程完成时立即中断等待(以便稍后恢复等待其他进程),我该怎么做? - antred
1
@antred 然后你应该使用(相当短的)超时调用.wait()并处理结果。据我所知,如果该进程尚未终止,则返回None,如果已经终止,则返回一个数字。 - glglgl
1
@glglgl 是的,那样做可以,但我想避免主动轮询的方式,不过我猜可能没有别的办法(我用的是Windows电脑)。此外,显然这个问题已经在这里得到了回答:https://dev59.com/-nVD5IYBdhLWcg3wE3No - antred
1
@glglgl 我希望Python在Windows上能够模拟Unix上os.waitpid(0)的功能。即使在底层,模拟也必须执行其他SO帖子中的线程解决方案所做的相同操作,但是如果Python可以提供这个功能,那仍然是很好的。 - antred
尝试使用Python 3.8.8,这种方法不再起作用。 - Franva
显示剩余3条评论

42
subprocess.call

自动等待,你也可以使用:

p1.wait()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接