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

CPython多进程间共享含numpy数组的只读复杂对象如何实现?

可以实现,以下是两种可落地的方案:

方案1:使用fork启动模式+写时复制(推荐,Linux环境首选)

Linux系统下multiprocessing默认的fork启动模式会使用写时复制(Copy-on-Write)机制,父进程中初始化的只读对象只要不在子进程中修改,就不会触发内存拷贝,全程仅保留一份实例。
修改要点:

  • 显式指定进程启动方式为fork(避免部分系统默认用spawn模式)
  • 不要将大实例通过pool的参数传递,参数序列化/反序列化过程会触发全量拷贝,改为将初始化完成的实例放在全局作用域,子进程直接读取全局实例即可

修改后的代码示例:

import numpy as np
from typing import List, Tuple
from multiprocessing import Pool, set_start_method

class ComplexClass:
    def __init__(
            self,
            u: np.ndarray,
            v: Tuple[Tuple[int, float]],
            w: str,
            x: int,
            y: List[Tuple[int, np.ndarray]],  # all numpy array here with same shape
            z: List[List[int]],  # inner list with same length
    ):
        self.u = u
        self.v = v
        self.w = w
        self.x = x
        self.y = y
        self.z = z

# 全局变量存储只读实例,子进程fork后直接复用
global_instance: ComplexClass = None

def handle(other_params):
    # 直接读取全局实例,只读操作不会触发COW拷贝
    instance = global_instance
    # 核心业务逻辑,只读使用instance即可
    ...

def main():
    global global_instance
    # 父进程中预先初始化好实例
    global_instance = ...  # get the instance of ComplexClass
    params_list = [0, 1, 2, 3]
    with Pool(4) as pool:
        res = pool.map(handle, params_list)

if __name__ == '__main__':
    # 显式指定fork启动模式
    set_start_method("fork", force=True)
    main()

该方案无需修改原有ComplexClass结构,零额外开发成本,内存占用只有单份50G,完全满足性能要求。

方案2:共享内存封装(兼容spawn模式,跨平台可用)

如果你的运行环境不支持fork模式,或者需要更稳定的跨平台兼容,可以将类中占内存99%以上的numpy数组、大列表转换为multiprocessing.shared_memory托管的共享内存结构,小字段(v/w/x等总内存不超过MB级)直接拷贝即可无感知。
实现要点:

  1. 父进程初始化实例时,将所有大体积的numpy数组、z列表转成的numpy数组存入共享内存,类中仅保存共享内存的名称、形状、数据类型等元信息
  2. 类实现__getstate__和__setstate__方法自定义序列化逻辑,序列化时仅传递元信息和小字段,不传递实际数据
  3. 子进程反序列化时,根据元信息映射共享内存,直接访问数据无需拷贝

这种方案实际数据仅存一份,类本身序列化后的体积不到1KB,即使通过参数传递也不会产生内存开销。

注意事项
  • 两种方案均为多进程实现,完全绕开GIL限制,不需要使用多线程,符合你的技术约束
  • 只读场景下不需要加任何锁,无数据竞争风险

内容的提问来源于stack exchange,提问作者maplemaple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:06:01