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
相关产品推荐
相关产品推荐

