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

