在Celery任务中导入rembg导致Worker进程异常退出
解决思路
这个错误是macOS系统下Celery的fork进程机制和rembg依赖的ObjC初始化逻辑冲突导致的:Celery默认用fork创建子进程,而rembg依赖的部分库(比如onnxruntime、PIL相关组件)会触发macOS的ObjC初始化安全检查,fork后的子进程无法安全完成初始化,直接崩溃退出。
以下是可行的解决方法:
切换Celery的进程池类型
放弃默认的fork模式,改用spawn或solo启动子进程:- 开发环境可以用单进程模式:
celery -A oml worker --loglevel=info --pool=solo - 生产环境推荐用spawn池:
celery -A oml worker --loglevel=info --pool=spawn
- 开发环境可以用单进程模式:
延迟导入rembg库
不要在任务模块的顶部导入rembg,而是在任务函数内部才导入,让fork后的子进程单独加载库,避免主进程提前触发ObjC初始化:from celery import shared_task @shared_task def image_background_remove(image_path): # 只在任务执行时才导入rembg from rembg import remove # 后续处理逻辑 with open(image_path, 'rb') as img_file: processed_data = remove(img_file.read()) # 保存处理结果等操作临时禁用ObjC的fork安全检查
在启动Celery Worker前设置环境变量,强制系统忽略这个安全检查(注意:此方法有潜在稳定性风险,仅作为临时应急方案):export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES celery -A oml worker --loglevel=info调整rembg依赖版本
尝试切换到兼容性更好的rembg版本,比如安装稳定版:pip install rembg==2.0.50同时检查onnxruntime是否适配你的macOS架构(arm64/x86_64),必要时指定架构安装:
pip install onnxruntime --force-reinstall --no-deps --platform=macosx_11_0_arm64
内容的提问来源于stack exchange,提问作者Cesar Jr Rodriguez
相关产品推荐
相关产品推荐

