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

