You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:30:03