如何使用Python的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
相关产品推荐
相关产品推荐

