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

如何使用Python的multiprocessing.shared_memory实现字典跨进程共享

使用multiprocessing.shared_memory实现字典跨进程共享的方案

核心原理

multiprocessing.shared_memory本身仅支持原始字节块的跨进程共享,字典属于Python结构化对象,无法直接写入共享内存。需要先将字典序列化为字节流,再写入共享内存块,其他进程挂载同一块共享内存后,读取字节流再反序列化为字典即可实现共享。

实现步骤

  • 选择序列化工具:标准库自带的pickle支持所有Python原生对象的序列化,无需额外依赖,适合绝大多数场景;如果追求更高性能可以选择第三方库msgpack
  • 主进程先将目标字典序列化为字节流,根据字节流长度创建对应大小的共享内存块
  • 将序列化后的字节写入共享内存块,向子进程传递共享内存的唯一名称
  • 子进程通过名称挂载对应共享内存块,读取全部字节后反序列化得到字典
  • 所有进程使用完成后,先关闭当前进程的共享内存挂载,最后由主进程执行共享内存的释放操作,避免内存泄漏

完整示例代码

import multiprocessing
from multiprocessing import shared_memory
import pickle

def child_task(shm_name: str):
    # 子进程挂载共享内存
    exist_shm = shared_memory.SharedMemory(name=shm_name)
    # 反序列化得到字典
    shared_dict = pickle.loads(exist_shm.buf)
    print(f"子进程读取结果:{shared_dict}")
    # 关闭当前进程的共享内存挂载
    exist_shm.close()

if __name__ == "__main__":
    # 待共享的原始字典
    raw_dict = {"user": "zhangsan", "age": 25, "scores": [90, 85, 95]}
    # 序列化字典为字节流
    dict_serialized = pickle.dumps(raw_dict)
    # 创建共享内存块,大小匹配序列化后的字节长度
    shm = shared_memory.SharedMemory(create=True, size=len(dict_serialized))
    # 写入序列化字节到共享内存
    shm.buf[:len(dict_serialized)] = dict_serialized

    # 启动子进程
    p = multiprocessing.Process(target=child_task, args=(shm.name,))
    p.start()
    p.join()

    # 主进程释放共享内存
    shm.close()
    shm.unlink()

注意事项

  • 如果需要跨进程修改字典内容,修改后需要重新序列化写入共享内存,同时必须搭配multiprocessing.Lock加锁控制读写时序,避免并发读写导致的数据损坏
  • 创建共享内存时需要预留足够的空间,如果后续字典内容会更新扩容,需要将共享内存的大小设置为大于最大预期的序列化后字节长度
  • 若对性能要求不高,优先使用multiprocessing.Manager.dict实现跨进程字典共享,无需手动处理序列化和内存管理,开发成本更低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:54:06