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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:45:08