在Windows 7/10中如何让Python等待多并行进程执行完成?
嘿,我帮你梳理几个在Windows 7/10环境下实现并行运行Python脚本并等待全部完成的靠谱方案,解决你之前用start /w导致串行执行的问题:
方法1:用Python的subprocess模块(首推)
这是最灵活可控的方式,完全在你的调度脚本内部处理,不需要依赖CMD的复杂语法,还能轻松扩展到30个进程。
核心思路是用subprocess.Popen启动每个脚本(不会阻塞主进程),然后等待所有子进程执行完毕后,再运行后续操作的脚本。
示例代码:
import subprocess import sys def launch_script(script_path): # 启动目标Python脚本,返回进程对象 return subprocess.Popen([sys.executable, script_path], shell=False) if __name__ == "__main__": # 定义要并行运行的脚本列表(后续扩展到30个直接加在这里就行) parallel_scripts = ["node1.py", "node2.py", "node3.py"] # 批量启动所有脚本,保存进程对象 running_processes = [launch_script(script) for script in parallel_scripts] # 等待每个进程执行完成 for proc in running_processes: proc.wait() # 所有并行脚本结束后,执行后续操作 print("所有节点脚本执行完毕,开始运行后续处理脚本") subprocess.run([sys.executable, "printstatement.py"], check=True)
- 用
sys.executable能确保调用的是当前Python环境的解释器,避免环境混乱 proc.wait()会阻塞主进程直到对应子进程完成,遍历所有进程就能实现等待全部结束- 如果需要捕获脚本的输出或处理错误,可以把
wait()换成communicate(),或者检查proc.returncode
方法2:改进CMD/PowerShell命令写法
如果你更倾向于用系统命令的方式调用,之前的&和&&组合逻辑不对(&&只在前面命令成功时才执行后续,但start是非阻塞的,会直接返回成功),可以改用PowerShell来实现等待多个进程:
import os # 用PowerShell命令批量启动进程并等待全部完成 os.system('''powershell -Command "$procs = @(); $procs += Start-Process python -ArgumentList 'node1.py' -PassThru; $procs += Start-Process python -ArgumentList 'node2.py' -PassThru; $procs += Start-Process python -ArgumentList 'node3.py' -PassThru; $procs | Wait-Process; Start-Process python -ArgumentList 'printstatement.py' -Wait"''')
Start-Process -PassThru会返回进程对象,收集到数组后用Wait-Process等待全部结束- 最后启动
printstatement.py时加-Wait确保它执行完才退出
方法3:用Python的multiprocessing模块管理进程
如果你的节点脚本可以改成可调用的函数,也可以用multiprocessing来并行执行,本质是通过多进程调用subprocess启动脚本:
from multiprocessing import Process import subprocess import sys def run_script(script_path): subprocess.run([sys.executable, script_path], check=True) if __name__ == "__main__": parallel_scripts = ["node1.py", "node2.py", "node3.py"] processes = [] # 逐个创建并启动进程 for script in parallel_scripts: p = Process(target=run_script, args=(script,)) p.start() processes.append(p) # 等待所有进程完成 for p in processes: p.join() # 执行后续操作 subprocess.run([sys.executable, "printstatement.py"], check=True)
总结
个人最推荐方法1,因为全程在Python内处理,逻辑清晰,扩展和维护都方便,后续要加到30个脚本只需要修改parallel_scripts列表即可,不需要调整核心逻辑。
内容的提问来源于stack exchange,提问作者Dror Bogin
相关产品推荐
相关产品推荐

