Python分布式任务队列Celery中任务有时注册失败的原因和解决方法
当服务器收到界面请求,调用 celery 执行异步任务时,查看 celery 执行结果,发现有时成功,有时失败,当失败时接收不到任务注册,redis 作为 backend,Redis 中的执行结果为 failure,原因是 Not Registered
- 现象: 任务注册有时成功有时失败,失败时提示 Not Registered。
- 配置:celery 4.2.1, python3.6 redis 存储。
有人遇到过我这种情况吗?
Python分布式任务队列Celery中任务有时注册失败的原因和解决方法
3 回复
Celery任务注册失败通常是因为模块导入路径或配置问题。最常见的是启动时没正确加载包含[@app](/user/app).task装饰器的模块。
核心原因和解决方案:
-
模块未正确导入
- 启动命令必须包含任务模块路径:
celery -A proj worker - 确保
proj模块的__init__.py中正确初始化Celery应用
- 启动命令必须包含任务模块路径:
-
任务装饰器位置不当
# 错误:在模块级别创建app前使用[@app](/user/app).task from celery import Celery [@app](/user/app).task # 此时app还未定义! def my_task(): pass app = Celery('proj') # 正确:先创建app再装饰任务 from celery import Celery app = Celery('proj') [@app](/user/app).task def my_task(): pass -
使用自动发现但模块不在默认位置
- 在配置中明确指定模块:
app.conf.update( imports=['myapp.tasks', 'otherapp.tasks'], ) -
检查启动日志
- 启动worker时添加
-l info查看注册的任务列表 - 确认日志中出现"Registered tasks:"并列出你的任务
- 启动worker时添加
快速排查步骤:
- 确保Celery应用实例在装饰任务前已创建
- 检查启动命令的模块路径是否正确
- 查看worker启动日志确认任务注册情况
- 确保任务函数在worker启动时能被导入
总结:检查模块导入顺序和启动配置。
本地测试( postman 连接本地服务) OK,测试服务器测试就异常。
我也遇到了这个问题,您解决没

