Python 中,GIL(全局解释器锁)导致单进程无法充分利用多核 CPU,而多进程通过独立解释器与内存空间,可实现真正并行计算,适用于数据加密、模型训练等 CPU 密集型任务。小编将详解多进程创建方法与进程间数据共享方案,助你高效处理高负载任务。
一、Python 多进程的 3 种创建方法
Python 主要通过multiprocessing库与concurrent.futures模块实现多进程,不同方法适配不同任务规模。
(一)Process 类:创建单个进程
适用于任务数量少的场景,需实例化Process指定目标函数与参数,调用start()启动,join()等待结束。Windows 系统需在if __name__ == "__main__":下执行,避免进程重复创建。
示例:
TypeScript取消自动换行复制
(二)Pool 类:进程池批量处理
任务量大时,Pool预先创建固定数量进程(默认等于 CPU 核心数),循环复用减少资源消耗。通过apply_async()异步提交任务,close()关闭池后用join()等待结果。
示例:
TypeScript取消自动换行复制
def square(num):
return num * num
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4) # 4核CPU设4进程
tasks = range(1, 11)
results = [pool.apply_async(square, (n,)) for n in tasks]
pool.close()
pool.join()
print([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:
tasks = range(1, 11)
results = list(executor.map(square, tasks)) # 直接获取结果
print(results)
二、进程间数据共享的 3 种方案
进程内存隔离,需通过专门机制实现数据交互,不同方案适配不同通信场景。
(一)队列(Queue):安全的多对多通信
基于消息传递,支持多进程并发读写,自动处理同步,适合 “生产者 - 消费者” 场景。put()添加数据,get()获取数据,避免数据竞争。
示例:
TypeScript取消自动换行复制
queue = multiprocessing.Queue()
def producer(queue):
for i in range(3):
queue.put(f"数据{i}")
def consumer(queue):
while not queue.empty():
print(f"处理:{queue.get()}")
if __name__ == "__main__":
p1 = multiprocessing.Process(target=producer, args=(queue,))
p2 = multiprocessing.Process(target=consumer, args=(queue,))
p1.start()
p1.join()
p2.start()
p2.join()
(二)管道(Pipe):高效的一对一通信
创建两个连接对象实现双向通信,速度比队列快,但仅支持两个进程交互。send()发送数据,recv()接收数据,适合简单双向通信。
示例:
TypeScript取消自动换行复制
conn_a, conn_b = multiprocessing.Pipe()
def process1(conn):
conn.send("请求数据")
print(f"接收响应:{conn.recv()}")
def process2(conn):
print(f"接收请求:{conn.recv()}")
conn.send("返回数据")
if __name__ == "__main__":
p1 = multiprocessing.Process(target=process1, args=(conn_a,))
p2 = multiprocessing.Process(target=process2, args=(conn_b,))
p1.start()
p2.start()
(三)共享内存(Value/Array):高效共享简单数据
Value共享单个值(如计数器),Array共享数组,基于操作系统共享内存机制,效率最高。需用Lock加锁避免多进程同时修改导致的数据竞争。
示例:
TypeScript取消自动换行复制
counter = multiprocessing.Value('i', 0) # 'i'表示int类型
lock = multiprocessing.Lock()
def increment(counter, lock):
with lock: # 加锁确保原子操作
counter.value += 1
if __name__ == "__main__":
processes = [multiprocessing.Process(target=increment, args=(counter, lock)) for _ in range(5)]
[p.start() for p in processes]
[p.join() for p in processes]
print(f"最终计数:{counter.value}") # 输出5
多进程创建需按需选择:单进程用Process,批量任务用Pool或ProcessPoolExecutor(推荐);数据共享中,队列安全、管道高效、共享内存适合简单数据。实际开发中,需结合任务规模与通信需求选择方案,确保兼顾效率与安全性,充分发挥多核 CPU 优势。