Redis未启动或broker_url配置错误导致Celery连接失败;任务不执行因未注册或broker不一致;Django中ORM需显式事务控制;celery-beat时区与权限配置不当致定时失效。

Redis连接不上导致Celery启动就报错
常见现象是 ConnectionRefusedError: Connection refused 或 redis.exceptions.ConnectionError,根本原因不是Celery写错了,而是Redis服务压根没起来,或者配置里的 broker_url 地址/端口/密码对不上。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先手动用
redis-cli -h 127.0.0.1 -p 6379 ping测试连通性;如果返回PONG再查 Celery 配置 -
broker_url必须带协议和数据库编号,比如redis://localhost:6379/0,漏掉/0有时会静默失败 - 用 Docker 启 Redis 的话,别写
localhost—— 容器里访问宿主得用host.docker.internal(Mac/Win)或宿主真实 IP(Linux) - 密码含特殊字符(如
@、/)必须 URL 编码,redis://:p@ss%40word@localhost:6379/0
Celery任务不执行也不报错
最典型的是调了 add.delay(1, 2),但 worker 日志没反应,也没进 Redis 的队列。本质是任务没注册进 worker 的任务列表,或者 broker 和 worker 连的不是同一个 Redis 实例。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确认
CELERY_IMPORTS或app.autodiscover_tasks是否加载了任务模块;没加载的话celery -A proj worker --loglevel=info启动时不会显示你的任务名 - 用
redis-cli KEYS "celery:*"看有没有队列数据;没有说明任务根本没发出去,检查broker_url是否和 worker 一致 - worker 启动后看第一行日志有没有类似
Tasks: { 'proj.tasks.add': add };没有就是任务没注册成功 - 别在
__init__.py里直接调add.delay()—— 模块导入阶段执行会卡住,应该放在视图、命令或信号回调里
任务函数里改数据库没生效
Django 项目里常见:任务里执行 User.objects.filter(id=1).update(name="x"),但数据库没变。这不是 Celery 的锅,是 Django 默认事务隔离 + 数据库连接未提交导致的假象。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- Django 任务中所有 ORM 操作,必须显式调用
transaction.on_commit()或用@transaction.atomic包裹,否则可能被回滚 - 避免在任务里复用主线程的数据库连接;Celery worker 是独立进程,每个任务应新建连接上下文
- 如果用的是 SQLite,别指望 Celery 并发跑任务——它不支持多进程写入,会直接报
database is locked - 调试时加个
print(User.objects.get(id=1).name)在 update 后,确认是不是缓存或查询延迟造成的误判
定时任务(beat)不触发
celery -A proj beat 进程在跑,但设定的每分钟任务从不执行。问题通常出在时区、序列化或调度器锁上,而不是 crontab 表达式写错。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确保
timezone和enable_utc配置一致;Django 项目务必设CELERY_TIMEZONE = "Asia/Shanghai"并关掉enable_utc,否则时间永远差 8 小时 - Beat 进程需要写权限创建
celerybeat-schedule文件,默认路径是当前目录;若无权限,它会静默失败,日志只报PermissionError一次 - 多个 beat 实例不能共用一个 schedule 文件,否则会抢锁失败;生产环境要么只启一个 beat,要么用
django-celery-beat把调度存在 DB 里 - crontab 参数顺序是
minute hour day-of-month month day-of-week,别按 Linux cron 习惯反着写;"*/5 * * * *"表示每 5 分钟,不是每小时 5 分
真正麻烦的从来不是怎么配,而是多个服务之间的时间同步、连接复用边界、还有那些不报错却默默失效的隐式依赖。调通之后记得盯三天日志,别信“看起来没问题”。









