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

121 投票
2 回答
269773 浏览
提问于 2025-04-17 17:17

我有一个主程序,它会创建两个或更多的子程序。我想让主程序等到所有的子程序都完成它们的操作后再退出。

 # 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)],这样在语法上更简洁)

这样会在所有子进程都完成后立即返回。你将得到一个返回码的列表,可以用来评估每个进程的执行结果。

撰写回答