Python3多任务管理实现咨询:多外部程序并行与同步
用multiprocessing实现多外部程序并行+后续任务执行
核心实现步骤
- 用
multiprocessing.Process封装每个外部程序的调用逻辑 - 启动所有子进程实现并行执行
- 可选:实时检查子进程运行状态
- 等待所有子进程结束后,执行后续函数
完整代码示例
假设你要并行运行echo "task1"、sleep 3 && echo "task2"、echo "task3"这三个外部命令,之后执行post_process()函数:
import multiprocessing import subprocess import time def run_external_cmd(cmd): """封装外部命令执行的函数""" try: # 调用外部程序,wait=True会等待命令执行完成 subprocess.run(cmd, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print(f"命令执行完成: {cmd}") except subprocess.CalledProcessError as e: print(f"命令执行失败: {cmd}, 错误信息: {e.stderr}") def post_process(): """所有子任务完成后执行的后续函数""" print("所有外部程序已结束,开始执行后续处理...") # 这里写你的后续逻辑 print("后续处理完成") if __name__ == "__main__": # 定义要并行执行的外部命令列表 cmds = [ 'echo "task1"', 'sleep 3 && echo "task2"', 'echo "task3"' ] # 创建子进程列表 processes = [] for cmd in cmds: p = multiprocessing.Process(target=run_external_cmd, args=(cmd,)) processes.append(p) # 启动子进程 p.start() # 实时检查子进程状态的逻辑(可选) print("开始实时监控子进程状态...") while True: # 检查是否还有活跃的子进程 active_processes = [p for p in processes if p.is_alive()] if not active_processes: break print(f"当前活跃子进程数: {len(active_processes)}") time.sleep(0.5) # 等待所有子进程结束(如果不用实时监控,直接用这段代码即可挂起主线程) # for p in processes: # p.join() # 执行后续函数 post_process()
关键知识点解释
1. 挂起主线程等待子进程结束
- 使用
Process.join()方法:对每个子进程调用join()会让主线程阻塞,直到该子进程结束。遍历所有进程调用join(),就能保证主线程等待所有子进程完成后再继续执行。 - 若不需要实时监控状态,直接替换掉实时监控循环即可,代码更简洁。
2. 实时检查子程序状态
Process.is_alive():返回布尔值,判断子进程是否还在运行- 循环遍历所有子进程,用
is_alive()统计活跃进程数,即可实现实时监控 - 循环中需添加
time.sleep(),避免占用过多CPU资源
3. 外部程序调用细节
- 示例中用
subprocess.run()执行外部命令,shell=True允许执行shell命令;如果是可执行文件路径,也可以直接传入列表形式的命令(比如["/path/to/your/program", "arg1"]),安全性更高 check=True会在命令返回非0状态时抛出异常,方便捕获错误stdout和stderr参数可捕获命令的输出和错误信息,可根据需求调整
内容的提问来源于stack exchange,提问作者Lex
相关产品推荐
相关产品推荐

