当前位置: 首页 > 技术教程

Python中的多进程怎么创建? 进程间如何共享数据?

  在 Python 中,GIL(全局解释器锁)导致单进程无法充分利用多核 CPU,而多进程通过独立内存空间与解释器,可突破此限制,高效处理数据计算、模型训练等 CPU 密集型任务。本文将简述多进程创建的三种核心方法,及进程间数据共享的实用方案。

  一、Python 多进程的创建方法

  Python 通过multiprocessing库与concurrent.futures模块实现多进程,三种方式覆盖不同场景需求。

  (一)Process类:创建单个进程

  适用于任务数量少的场景,通过实例化Process指定目标函数与参数,调用start()启动,join()等待结束。Windows 系统需在if __name__ == "__main__":下执行,避免进程重复创建。

  示例核心代码:

  TypeScript取消自动换行复制

  import multiprocessing

  def task(num):

  print(f"进程任务:{num}")

  if __name__ == "__main__":

  p = multiprocessing.Process(target=task, args=(1,))

  p.start()

  p.join()

  (二)Pool类:进程池批量处理

  任务量大时,Pool预先创建固定数量进程(默认等于 CPU 核心数),循环复用减少资源消耗。通过apply_async()异步提交任务,close()关闭池后用join()等待结果。

  示例核心代码:

  TypeScript取消自动换行复制

  pool = multiprocessing.Pool(processes=4)

  tasks = range(1, 11)

  results = [pool.apply_async(task, (n,)) for n in tasks]

  pool.close()

  pool.join()

  final = [r.get() for r in results]

  (三)ProcessPoolExecutor:简洁管理(推荐)

  Python 3.2 + 引入的ProcessPoolExecutor封装底层细节,支持with语句自动管理池生命周期,map()批量获取结果,代码更简洁。

  示例核心代码:

  TypeScript取消自动换行复制

  from concurrent.futures import ProcessPoolExecutor

  with ProcessPoolExecutor(max_workers=4) as executor:

  results = list(executor.map(task, range(1, 11)))

python3.png

  二、进程间数据共享方案

  进程内存隔离,需通过专门机制实现数据交互,三种方案各有适用场景。

  (一)队列(Queue):安全的多对多通信

  基于消息传递,支持多进程并发读写,自动处理同步,适合 “生产者 - 消费者” 场景。put()添加数据,get()获取数据,避免数据竞争。

  示例核心代码:

  TypeScript取消自动换行复制

  queue = multiprocessing.Queue()

  # 生产者

  p1 = multiprocessing.Process(target=produce, args=(queue,))

  # 消费者

  p2 = multiprocessing.Process(target=consume, args=(queue,))

  (二)管道(Pipe):高效的一对一通信

  创建两个连接对象实现双向通信,速度比队列快,但仅支持两个进程交互。send()发送数据,recv()接收数据,适合简单双向通信。

  示例核心代码:

  TypeScript取消自动换行复制

  conn_a, conn_b = multiprocessing.Pipe()

  p1 = multiprocessing.Process(target=process_a, args=(conn_a,))

  p2 = multiprocessing.Process(target=process_b, args=(conn_b,))

  (三)共享内存(Value/Array):高效共享简单数据

  Value共享单个值(如计数器),Array共享数组,基于操作系统共享内存机制,效率最高。需用Lock加锁避免多进程同时修改导致的数据竞争。

  示例核心代码:

  TypeScript取消自动换行复制

  counter = multiprocessing.Value('i', 0)

  lock = multiprocessing.Lock()

  p = multiprocessing.Process(target=increment, args=(counter, lock))

  def increment(counter, lock):

  with lock:

  counter.value += 1

  多进程创建需根据任务数量选择:单进程用Process,批量任务用Pool或ProcessPoolExecutor(推荐)。数据共享中,队列安全、管道高效、共享内存适合简单数据,实际开发需结合场景选择,确保兼顾效率与安全性。掌握这些方法,可充分发挥多核 CPU 优势,提升 Python 处理 CPU 密集型任务的能力。

 


猜你喜欢