Python分布式任务队列Celery中任务有时注册失败的原因和解决方法

当服务器收到界面请求,调用 celery 执行异步任务时,查看 celery 执行结果,发现有时成功,有时失败,当失败时接收不到任务注册,redis 作为 backend,Redis 中的执行结果为 failure,原因是 Not Registered

  1. 现象: 任务注册有时成功有时失败,失败时提示 Not Registered。
  2. 配置:celery 4.2.1, python3.6 redis 存储。

有人遇到过我这种情况吗?


Python分布式任务队列Celery中任务有时注册失败的原因和解决方法

3 回复

Celery任务注册失败通常是因为模块导入路径或配置问题。最常见的是启动时没正确加载包含[@app](/user/app).task装饰器的模块。

核心原因和解决方案:

  1. 模块未正确导入

    • 启动命令必须包含任务模块路径:celery -A proj worker
    • 确保proj模块的__init__.py中正确初始化Celery应用
  2. 任务装饰器位置不当

    # 错误:在模块级别创建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
    
  3. 使用自动发现但模块不在默认位置

    • 在配置中明确指定模块:
    app.conf.update(
        imports=['myapp.tasks', 'otherapp.tasks'],
    )
    
  4. 检查启动日志

    • 启动worker时添加-l info查看注册的任务列表
    • 确认日志中出现"Registered tasks:"并列出你的任务

快速排查步骤:

  1. 确保Celery应用实例在装饰任务前已创建
  2. 检查启动命令的模块路径是否正确
  3. 查看worker启动日志确认任务注册情况
  4. 确保任务函数在worker启动时能被导入

总结:检查模块导入顺序和启动配置。


本地测试( postman 连接本地服务) OK,测试服务器测试就异常。

我也遇到了这个问题,您解决没

回到顶部