能显著提升吞吐量5–10倍,但需严格管理生命周期:创建时必须指定create=true和正size,连接时仅传name且create=false;buf无类型信息,推荐用numpy.ndarray配合一致shape/dtype;close()每进程必调,unlink()仅由创建者调一次;无内置同步,须手动加锁。

直接用 multiprocessing.shared_memory 替代 multiprocessing.Queue,能显著减少序列化和内存拷贝,实测吞吐量提升 5–10 倍,但必须手动管理生命周期,否则极易泄漏或崩溃。
SharedMemory 实例创建时必须明确指定 create 和 size
不填 create=True 就默认连接已有块,如果名字不存在会直接报 FileNotFoundError;不填 size 而又设了 create=True 会抛 ValueError: size must be positive。常见错误是只写 SharedMemory(name="mybuf"),结果既没创建也没连上。
- 新建块:必须同时设
create=True和size=xxx,name可为None(系统自动生成唯一名) - 连接已有块:设
create=False(或省略),只传name,size被忽略 - 跨平台注意:Linux 下名称带
/前缀(如/mydata),Windows 不支持该前缀,建议统一用纯字母数字名(如"mydata123")
用 buf 属性读写前,得先确认数据结构和边界
SharedMemory.buf 是个 memoryview,它本身不带类型或长度信息。直接当字节数组读写容易越界或解析错——比如往 1024 字节块里写一个 int64 数组却按 int32 解,值就全乱了。
- 推荐搭配
numpy.ndarray使用:np.ndarray(shape, dtype, buffer=shm.buf),shape 和 dtype 必须与写入时严格一致 - 避免直接对
buf做buf[:4] = b'\x01\x00\x00\x00'这类操作,除非你清楚字节序和对齐 - 若需存字符串,先 encode 成 bytes 再写入,且要预留结尾 \0 或记录长度,不能依赖 \0 自动截断
close() 和 unlink() 的调用时机不能颠倒或遗漏
close() 是每个进程退出前必须做的,表示“我不再访问这块内存”;unlink() 是销毁请求,**所有进程里只能由某一个进程调用一次**。调早了(比如创建者一建完立刻 unlink),其他进程再 open 就失败;漏调了,共享内存块会一直留在系统里,ipcs -m(Linux)能看到残留,重启都清不掉。
- 典型流程:子进程
close()→ 主进程等全部子结束 → 主进程调unlink() - 不要在
finally块里无条件unlink(),否则多个进程并发执行会触发FileNotFoundError或静默失败 - 调试时可用
shm.size和shm.name打印确认当前操作对象,避免误关/误删
最易被忽略的是:共享内存本身不提供同步机制。多个进程同时读写同一片 buf 区域,不加锁就会出现脏读、覆盖写、部分更新等竞态问题——这和 Queue 的线程安全完全不同,得自己用 multiprocessing.Semaphore 或 Lock 控制访问。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











