在 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)))
二、进程间数据共享方案
进程内存隔离,需通过专门机制实现数据交互,三种方案各有适用场景。
(一)队列(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 密集型任务的能力。