Python 实现多程序同步执行的方法
在 Python 开发中,经常需要同时启动多个外部程序或脚本。本文详细解析如何利用 subprocess、threading 和 multiprocessing 模块实现多程序的同步与异步执行,涵盖参数传递、结果获取及异常处理等关键操作。
核心方法概览
要实现“同时运行多个程序”,本质上是将任务分发到不同的执行流中。Python 提供了三种主流方案,分别适用于不同场景:
- subprocess 模块:适用于调用外部可执行文件或脚本,支持同步阻塞和异步非阻塞模式。
- threading 模块:适用于 I/O 密集型任务,通过多线程实现并发执行。
- multiprocessing 模块:适用于 CPU 密集型任务,利用多进程绕过 GIL 限制,实现真正的并行计算。
方法一:使用 subprocess 模块
subprocess 是 Python 官方推荐的调用外部程序的接口。它允许父进程启动子进程,并控制其输入输出。
1. 同步执行(阻塞模式)
默认情况下,subprocess 是同步执行的。这意味着代码会等待当前程序执行完毕后,再执行下一行。虽然这看起来是“顺序”执行,但可以通过控制逻辑实现复杂的串行依赖。
import subprocess
# 启动第一个程序,并等待其完成
subprocess.run(['python', 'script1.py'])
print('第一个程序执行完毕')
# 启动第二个程序,并等待其完成
subprocess.run(['python', 'script2.py'])
print('第二个程序执行完毕')2. 异步执行(非阻塞模式)
若需真正“同时”运行,需使用 Popen 对象,不等待子进程结束即可继续执行后续代码。这种方式适用于需要并行启动多个耗时任务且无需立即获取结果的场景。
import subprocess
# 启动程序1,不等待结束
proc1 = subprocess.Popen(['python', 'script1.py'])
# 启动程序2,不等待结束
proc2 = subprocess.Popen(['python', 'script2.py'])
# 此时两个程序已在后台同时运行
print('两个程序已启动')
# 等待所有程序结束,并获取返回码
proc1.wait()
proc2.wait()
print('所有程序执行完毕')方法二:使用 threading 模块
如果“程序”指的是 Python 内部的函数或脚本逻辑,使用多线程是更轻量级的选择。通过 threading.Thread 可以创建多个线程并发执行任务。
import threading
import time
def run_task(task_name):
print(f'开始执行 {task_name}')
time.sleep(2) # 模拟耗时操作
print(f'{task_name} 执行完毕')
# 创建线程
thread1 = threading.Thread(target=run_task, args=('Task A',))
thread2 = threading.Thread(target=run_task, args=('Task B',))
# 启动线程
thread1.start()
thread2.start()
# 等待线程结束
thread1.join()
thread2.join()
print('所有线程执行完毕')方法三:使用 multiprocessing 模块
对于计算密集型任务,多线程受限于 Python 的全局解释器锁(GIL)。此时应使用 multiprocessing 模块,它通过创建独立的进程来执行任务,真正实现并行。
from multiprocessing import Process
import time
def compute(task_id):
print(f'进程 {task_id} 开始计算')
time.sleep(3)
print(f'进程 {task_id} 计算结束')
if __name__ == '__main__':
# 创建进程
p1 = Process(target=compute, args=(1,))
p2 = Process(target=compute, args=(2,))
# 启动进程
p1.start()
p2.start()
# 等待进程结束
p1.join()
p2.join()
print('所有进程执行完毕')选择建议
- 调用外部命令/脚本:首选
subprocess。若需并行,使用Popen配合wait()。 - I/O 密集型任务(如网络请求、文件读写):使用
threading,开销小,实现简单。 - CPU 密集型任务(如数据处理、图像渲染):使用
multiprocessing,避免 GIL 限制。
以上就是 Python 同时运行多个程序的详细内容,更多关于 Python 并发编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









