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

Django Celery抛出KeyError问题排查求助

问题原因与解决方案

核心问题:任务名称不匹配

从worker日志能看到,实际加载的任务完整名称是user_statistic_status.tasks.my_test,但你在beat_schedule里配置的任务名是my_test,Celery无法通过短名称找到对应任务,因此抛出KeyError: my_test。

修复步骤

1. 修正beat_schedule中的任务名称

把beat_schedule里的task值改成worker日志显示的完整任务路径:

app.conf.beat_schedule = {
    'my-task-every-2-minutes': {
        'task': 'user_statistic_status.tasks.my_test',  # 替换为完整任务路径
        'schedule': crontab(minute='*/1'),
    },
}

2. (可选)更稳妥的写法:用任务对象的__name__属性

避免手动写路径出错,直接引用任务的__name__属性:

@shared_task
def my_test():
    print('Celery from task says Hi')

app.conf.beat_schedule = {
    'my-task-every-2-minutes': {
        'task': my_test.__name__,  # 直接绑定任务的名称属性
        'schedule': crontab(minute='*/1'),
    },
}

3. 优化建议:迁移beat配置到全局位置

不建议把beat_schedule放在应用的tasks.py里,因为autodiscover_tasks()会扫描所有tasks.py,可能导致配置重复加载。推荐将定时任务配置移到项目根目录的celery.py,或者Django的settings.py中(需添加CELERY_前缀,比如CELERY_BEAT_SCHEDULE)。

验证操作

  1. 重启beat服务:celery -A project beat -l info
  2. 重启worker服务:celery -A project worker -l info
  3. 观察日志,确认任务正常执行且无KeyError抛出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:45:35