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

Django项目中Celery定时任务(Redis Broker)未执行求助

Django + Celery Beat 定时任务不执行排查问题

我正在开发一个Django项目,使用Celery搭配Redis Broker运行异步任务。设置了一个每分钟执行一次的hello任务,但任务未按预期执行——Celery Worker已注册该任务,但定时任务始终没有实际运行。

相关代码与配置

任务代码

# socials/tasks.py
from celery import shared_task
import logging

logger = logging.getLogger(__name__)

@shared_task
def hello():
    logger.info("Hello")
    print("Hello")

Django配置(settings.py)

CELERY_BROKER_URL = 'redis://localhost:6379/0'  # 本地运行Redis

CELERY_BEAT_SCHEDULE = {
    'every-minute': {
        'task': 'socials.tasks.hello',
        'schedule': crontab(minute='*/1')
    },
}

启动命令

celery -A my_project worker --loglevel=info
celery -A my_project beat --loglevel=info

日志信息

  • Worker日志显示任务已注册:
[tasks]
  . socials.tasks.hello
  • Beat日志显示已连接Redis:
Configuration ->
    . broker -> redis://localhost:6379/0

已知情况

Redis服务正常运行,Worker和Beat均可连接Redis;在Django Shell中同步执行hello任务正常,但定时任务始终未执行,无报错,也未输出"Hello"日志或打印内容。


排查方向与解决方案

1. 验证Celery Beat是否正确加载定时任务

启动Beat时添加--dump参数,查看实际加载的任务列表:

celery -A my_project beat --dump

如果输出中没有every-minute任务,说明配置未被正确读取,常见原因:

  • settings.py中缺少crontab导入,需添加:from celery.schedules import crontab
  • Celery配置命名空间问题:Celery 4+版本需要通过namespace='CELERY'指定配置前缀,确认Celery初始化文件(my_project/celery.py)代码:
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')

app = Celery('my_project')
# 必须指定namespace,否则Beat无法识别CELERY_BEAT_SCHEDULE
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

2. 确认Worker与Beat使用同一Redis实例/数据库

通过Redis CLI检查任务队列状态:

redis-cli
127.0.0.1:6379> KEYS *celery*
  • 如果Beat未发送任务,celery队列会为空;如果Worker未消费,队列会积压任务。
  • 若Redis有密码验证,需在CELERY_BROKER_URL中添加密码:redis://:password@localhost:6379/0

3. 检查Worker的队列监听与日志细节

  • 启动Worker时明确指定监听默认队列(避免路由配置错误):
celery -A my_project worker --loglevel=info -Q celery
  • 开启Debug日志,查看任务接收与执行的详细过程:
celery -A my_project worker --loglevel=debug

4. 检查Celery与Django的版本兼容性

不同版本的Celery和Django可能存在兼容问题,查看当前依赖版本:

pip freeze | grep -E 'celery|django'

例如:Celery 5.x适配Django 3.2+,Celery 4.x适配Django 2.2+至3.x。

5. 验证任务序列化配置

序列化方式不匹配可能导致Worker无法解析任务,在settings.py中添加序列化配置:

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:00:23