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

FastAPI集成Celery时Flower面板显示注册任务但未触发执行问题

问题排查原因及解决方案

核心原因1:任务调用名称与注册名称不匹配

调用send_task时传入的任务名是app.workers.download_and_generate_logs_df,但实际注册的任务完整名称是app.workers.download_and_generate_logs_df.download_and_generate_logs_df(模块名+函数名),二者不匹配导致任务无法匹配预设路由规则,不会被投递到main-queue队列,而你的Celery worker仅监听main-queue,自然不会消费到该任务。

核心原因2:Celery未显式配置任务导入路径

启动worker时仅指定了Celery实例入口,没有配置include参数主动加载任务模块,部分场景下会导致worker实际未加载任务逻辑,即使任务名称匹配也无法执行。

其他潜在问题:参数传递错误

任务定义第一个入参是repo对象,需要调用repo.provider属性,但你调用时传入的是repo.name字符串,后续任务即使触发也会抛出属性不存在的报错。


对应解决方案

  • 修正任务调用名称与传参
    修改main.py中的send_task调用,补全完整任务名,同时修正传参内容:
    celery_task = celery_app.send_task(
                "app.workers.download_and_generate_logs_df.download_and_generate_logs_df",
                args=[repo, token],
            )
    
  • 补充Celery任务导入配置
    修改celery_app.py配置,添加include参数指定任务模块路径:
    from celery import Celery
    
    celery_app = Celery(
        "workers", 
        broker="amqp://guest@queue//",
        include=["app.workers.download_and_generate_logs_df"]
    )
    
    celery_app.conf.task_routes = {
        "app.workers.download_and_generate_logs_df.download_and_generate_logs_df": "main-queue"
    }
    
  • 可选简化调用方式(避免手写任务名出错)
    直接导入任务对象调用.delay()方法:
    # main.py中先导入任务
    from app.workers.download_and_generate_logs_df import download_and_generate_logs_df
    
    # 调用时直接使用delay方法
    celery_task = download_and_generate_logs_df.delay(repo, token)
    
  • 验证配置生效
    重启Celery worker后触发任务,执行celery -A app.core.celery_app inspect pending命令查看main-queue中是否存在待消费任务,确认任务被正确投递。

额外提示:任务函数的类型注解与实际返回值不匹配,你定义返回类型为str但实际返回字典,建议修正避免后续类型校验报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:39:02