如何在Python并行进程池中实现对象池复用,减少重复拷贝开销?
解决方案
你可以直接利用multiprocessing.Pool自带的进程初始化机制实现需求:每个工作进程启动时仅执行一次对象拷贝,后续该进程处理所有任务时都复用这份拷贝,拷贝总数等于你设置的进程数,完全避免逐任务重复拷贝的资源浪费。
实现代码
import multiprocessing import copy # 导入你自己的可变对象类和计算函数 from your_module import MutableObject, fun # 进程内部全局变量,每个进程持有独立的对象副本 process_local_obj = None def worker_init(original_obj): """进程初始化回调,每个工作进程启动时仅执行1次""" global process_local_obj # 仅做一次深拷贝 process_local_obj = copy.deepcopy(original_obj) def task_handler(arg): input_a, input_b = arg # 直接复用当前进程已有的对象副本,无需重复拷贝 return fun(process_local_obj, input_a, input_b) if __name__ == "__main__": # 主进程原始对象,仅存在1份 origin_obj = MutableObject() inputs = [...] # 你的输入参数对列表 # 创建进程池,指定初始化函数和传入的原始对象 # 默认进程数等于CPU核心数,你也可以手动指定processes参数调整 with multiprocessing.Pool( initializer=worker_init, initargs=(origin_obj,) ) as pool: outputs = pool.map(task_handler, inputs)
方案优势
- 拷贝次数固定等于进程数,不会随输入规模增长,针对你提到的大体积Keras模型场景,可以完全避免大量重复拷贝带来的CPU、内存开销
- 进程间完全隔离,每个进程修改自己持有的对象副本不会影响其他进程,和你原有串行逻辑的执行结果完全一致
- 无额外依赖,直接使用标准库实现,不需要引入第三方对象池组件
场景适配说明
如果你的Keras模型运行在GPU上,需注意:
- 进程数不要超过单卡可承载的模型数量上限,避免显存溢出,可手动调低
processes参数 - 多GPU环境下可以在
worker_init函数中给每个进程分配不同的GPU设备,进一步提升并行效率
内容的提问来源于stack exchange,提问作者Emil Jansson
相关产品推荐
相关产品推荐

