Python multiprocessing shared_memory跨subprocess访问报No such file错误问询
问题原因分析
- 核心原因是共享内存的生命周期管理错误:
mysubprocess.py执行完print(shm.name)后会立即退出,子进程终止时Python解释器会自动回收SharedMemory实例,触发内部清理逻辑直接销毁共享内存段,此时父进程还未完成attach操作,自然会找不到对应的共享内存文件。 - 次要排查点:子进程可能执行报错未成功创建共享内存,可在父进程中读取
proc.stderr.read()打印子进程错误输出,确认子进程执行正常。
解决方案
1. 修改子进程逻辑,保持共享内存存活直到父进程attach完成
在子进程中增加等待逻辑,等父进程通知后再退出,避免共享内存提前释放。修改后的mysubprocess.py代码:
from multiprocessing import shared_memory import sys s = "some string" shm = shared_memory.SharedMemory(create=True, size=len(s)) buffer = shm.buf buffer[:] = bytes(s, 'utf-8') # 刷新输出缓冲区,确保父进程能立刻读到共享内存名 print(shm.name, flush=True) # 等待父进程发送结束信号 sys.stdin.readline() # 父进程处理完成后再清理共享内存 buffer.release() shm.close() shm.unlink()
2. 修改父进程逻辑,确认attach完成后通知子进程退出
修改后的test.py代码:
import subprocess from multiprocessing import shared_memory proc = subprocess.Popen( ['python', 'mysubprocess.py'], stdin=subprocess.PIPE, # 新增stdin用于给子进程发信号 stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=False ) line = proc.stdout.readline().strip() if not line: print("子进程执行错误:", proc.stderr.read().decode('utf-8')) exit(1) shm_name = line.decode('utf-8') try: shm = shared_memory.SharedMemory(name=shm_name, create=False) buffer = shm.buf # 仅读取实际长度的内容,避免多余空字节 print(bytes(buffer[:len("some string")]).decode('utf-8')) finally: # 先关闭本地attach的共享内存 if 'shm' in locals(): buffer.release() shm.close() # 通知子进程可以退出清理 proc.stdin.write(b'\n') proc.stdin.flush() proc.wait()
3. Docker环境排查(可选)
如果修改代码后仍然报错,检查容器共享内存配置:
- 执行
df -h /dev/shm确认共享内存分区存在且有剩余空间 - 若启动容器时指定了
--shm-size参数,确认大小足够存储你的共享内存数据
内容的提问来源于stack exchange,提问作者user1179317
相关产品推荐
相关产品推荐

