Django Celery Beat调度定时任务时worker报KeyError找不到任务问题咨询
问题成因
这个KeyError: 'transactions.tasks.add_trades_to_database'报错核心是Celery worker进程没有找到匹配的目标定时任务,具体原因来自两处配置不匹配:
- 你在
@task装饰器里手动指定了任务名称为add_trades_to_database,但在celery.py的beat_schedule配置里填写的任务名是带路径的transactions.tasks.add_trades_to_database,两边名称不匹配,导致beat推送的任务标识和worker已注册的任务标识对不上 - 你启动Celery的命令参数错误:你的Celery实例绑定的Django项目名是
example_api,但启动命令里写的是-A project,worker读取了错误的项目入口,自然加载不到transactions应用下的任务
解决方法
第一步:统一任务名称
两种方案二选一即可:
- 方案1:修改
celery.py里的beat_schedule配置,把task字段的值改为你手动指定的名称,和装饰器参数保持一致:
app.conf.beat_schedule = { 'add_trades_to_database_periodically': { 'task': 'add_trades_to_database', 'schedule': crontab(minute='*/1'), }, }
- 方案2:删除
tasks.py里@task装饰器的name参数,让Celery自动生成带路径的任务名,和你现有beat配置匹配:
@task def add_trades_to_database(): # 原有业务逻辑保持不变
第二步:修正Celery启动命令
把启动命令里的-A project替换为你的实际项目名example_api:
# 启动worker celery -A example_api worker -l info # 启动beat celery -A example_api beat -l info
第三步:清空残留任务(可选)
如果修改后仍有报错,先停止运行的beat和worker,清空RabbitMQ里残留的旧任务队列,再重新启动服务即可。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

