等待进程直到所有子进程完成?
我有一个主程序,它会创建两个或更多的子程序。我想让主程序等到所有的子程序都完成它们的操作后再退出。
# main_script.py
p1 = subprocess.Popen(['python script1.py'])
p2 = subprocess.Popen(['python script2.py'])
...
#wait main process until both p1, p2 finish
...
2 个回答
42
subprocess.call
这个功能会自动等待,你也可以使用:
p1.wait()
157
一个 Popen
对象有一个 .wait()
方法,专门用来等待一个子进程完成(同时还会返回它的退出状态)。
如果你使用这个方法,就能避免进程变成“僵尸进程”,也就是那些已经结束但仍然占用系统资源的进程,避免它们在系统里待太久。
(另外,你也可以使用 subprocess.call()
或 subprocess.check_call()
来调用和等待进程。如果你不需要和进程进行输入输出,这可能就够用了。但通常这不是个好选择,因为如果你希望两个子进程并行运行,使用 call()
或 check_call()
是无法实现的。)
如果你有多个子进程需要等待,可以这样做:
exit_codes = [p.wait() for p in p1, p2]
(或者你也可以写成 exit_codes = [p.wait() for p in (p1, p2)]
,这样在语法上更简洁)
这样会在所有子进程都完成后立即返回。你将得到一个返回码的列表,可以用来评估每个进程的执行结果。