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

Docker环境Python使用billiard创建进程池报No such file or directory错误

错误产生原因
  • 核心触发点是WSL环境下Docker容器的共享内存机制与billiard库的默认实现不兼容:billiard创建共享内存对象时默认调用系统/dev/shm路径,而WSL下Docker默认分配的/dev/shm空间仅64MB,且部分精简镜像/旧版WSL会出现该路径权限配置错误、未正确挂载的问题。原生multiprocessing库内置了WSL环境下的fallback逻辑,会自动切换到其他共享内存实现,因此不会报错。
  • 版本适配问题:你当前使用的billiard版本与Python3.8.6在WSL+Docker场景下存在已知兼容缺陷,旧版本billiard未做WSL环境的兼容适配,无法自动识别异常的/dev/shm路径。同事能正常运行是因为其环境为原生Linux、WSL配置更完善,或者使用的billiard版本不存在该兼容问题。
  • 进程池资源配置不合理:你初始化Pool时未指定进程数,默认会启用和CPU核心数相等的工作进程,结合你代码里配置的16个worker,需要的共享内存大小超过了Docker默认分配的64MB阈值,进一步触发了共享内存分配失败的问题。
根本解决方案
  • 调整Docker共享内存配置:
    直接启动容器时,添加启动参数--shm-size="2g",根据业务负载可调整为1G~4G不等;
    若使用docker-compose编排,在celery_worker服务的配置段添加shm_size: '2gb',重新启动容器即可生效。
  • 强制指定billiard共享内存路径:
    在导入billiard的代码最开头添加如下配置,强制billiard使用/tmp路径创建共享内存,绕过/dev/shm的限制:
    import os
    os.environ['BILLIARD_SHARED_MEMORY_DIR'] = '/tmp'
    import billiard as multiprocessing
    
  • 更换兼容版本的billiard:
    执行命令pip install billiard==4.0.2,该版本是Python3.8下经过验证的稳定版本,修复了WSL环境下的共享内存分配bug。
  • 若你当前使用的是WSL1,建议升级到WSL2,WSL1对共享内存的系统调用支持存在原生缺陷,会导致大量多进程相关库的兼容问题。

内容的提问来源于stack exchange,提问作者Luis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:18:02