
python 的 multiprocessing.shared_memory 不支持带斜杠的嵌套名称(如 'dir/name'),因其底层依赖操作系统对共享内存对象的命名约束——windows 会将其映射为文件路径,导致 / 触发“invalid argument”错误;unix 类系统虽部分支持,但为保证可移植性,应避免手动指定含路径分隔符的名称。
python 的 multiprocessing.shared_memory 不支持带斜杠的嵌套名称(如 'dir/name'),因其底层依赖操作系统对共享内存对象的命名约束——windows 会将其映射为文件路径,导致 / 触发“invalid argument”错误;unix 类系统虽部分支持,但为保证可移植性,应避免手动指定含路径分隔符的名称。
shared_memory.SharedMemory 的 name 参数并非任意字符串,而是需符合操作系统的共享内存对象命名规范。在 Windows 上,name 会被直接用作 Windows 内核对象名(如 Global\test_dir/test_name),而反斜杠 \ 是合法分隔符,但正斜杠 / 不被识别,会导致 OSError: Invalid argument;在类 Unix 系统(Linux/macOS)中,POSIX 共享内存通常挂载于 /dev/shm/,其对象名需为纯文件名格式(即不含 /、以字母或下划线开头、仅含字母数字和下划线),因此 'test_dir/test_name' 会被解释为路径而非名称,同样失败。
✅ 正确做法是:不手动指定 name,让系统自动生成唯一名称,再通过 shm.name 获取并传递该名称:
from multiprocessing import shared_memory
# ✅ 正确:让系统生成安全、跨平台兼容的名称
shm = shared_memory.SharedMemory(size=1024, create=True)
print(f"Generated name: {shm.name}") # 如 'psm_8a3f2c1e'
# 可将 shm.name 通过队列、文件、环境变量或命令行参数传递给子进程
# 子进程使用该名称连接:
# shm_client = shared_memory.SharedMemory(name=shm.name)
⚠️ 注意事项:
- shm.name 是只读属性,生成后不可修改;
- 多进程间共享该名称时,务必确保接收方在创建者调用 shm.unlink() 之前完成连接;
- 若需语义化标识,建议用独立配置(如字典映射)将业务名("user_cache")映射到实际 shm.name,而非嵌入路径;
- 所有使用完毕后,必须显式调用 shm.close() 和 shm.unlink()(仅创建者调用 unlink),否则共享内存段将残留。
总结:共享内存名称本质是操作系统级标识符,非文件路径。放弃“目录式命名”思维,拥抱自动生成 + 显式传递的模式,是实现健壮、跨平台多进程共享内存通信的关键实践。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











