Celery在Django中不执行任务的主因是worker未启动或未连上broker;需验证Redis/RabbitMQ服务、CELERY_BROKER_URL配置及worker是否Ready,任务模块须被autodiscover_tasks正确加载,result_backend应与broker分离DB。

Celery 在 Django 里跑不起来,90% 的情况不是代码写错了,而是 worker 没连上 broker 或根本没启动——task.delay() 调了等于白调,任务卡在队列里没人消费。
Broker 连不上?先看连接是否静默失败
Redis 或 RabbitMQ 挂了、URL 写错、端口被占,Celery 默认不会报错,而是退化成内存队列(仅单进程内有效),导致你完全看不到 Worker 日志。
-
CELERY_BROKER_URL必须严格匹配服务类型:Redis 用redis://127.0.0.1:6379/0,RabbitMQ 用pyamqp://guest@localhost//(注意末尾双斜杠) - 手动验证服务状态:
redis-cli ping应返回PONG;curl -I http://localhost:15672能通说明 RabbitMQ Web 管理页可访问 - 加这行配置防静默:
broker_connection_retry_on_startup = True,否则 Worker 启动时 broker 未就绪会直接退出
Worker 启动了但不执行任务?检查任务模块是否被发现
app.autodiscover_tasks() 不是魔法,路径错一层、__init__.py 缺一个、包名拼错,都会让任务注册失败——此时 task.delay() 抛 NotRegistered 异常,但很多人没捕获。
- 确保每个
tasks.py文件都在PYTHONPATH可达路径下,且被autodiscover_tasks(['myapp.tasks'])显式列出 - 任务函数必须带
@shared_task(推荐)或@app.task装饰器,且不能在模块顶层访问 Django model(会触发AppRegistryNotReady) - 启动 Worker 时加
-Q指定队列名,再用celery -A myproject inspect active_queues确认它监听的是你投递任务的目标队列
结果拿不到或 result.get() 一直卡住?Backend 配置和调用方式要对齐
用 result.get() 阻塞等待却没返回,大概率是 result_backend 没配,或者和 broker 用了同一个 Redis DB(Redis 不支持跨 DB 原子操作,结果写入会失败)。
立即学习“Python免费学习笔记(深入)”;
- 强制分离存储:broker 用
redis://127.0.0.1:6379/0,result backend 用redis://127.0.0.1:6379/1 - 别混用调用方式:
delay()是apply_async()的快捷方式,但设countdown、eta、queue等参数必须用apply_async() - 生产环境禁用
result.get(timeout=...),改用轮询result.ready()+ 重试,或通过link参数指定回调任务处理完成逻辑
async def 视图里直接调 task.delay()?这是阻塞 event loop 的典型操作
Celery 的 delay() 底层依赖 blocking socket 和 pickle,无法 yield 控制权。在 FastAPI/Quart 的 async route 里直接调,会导致接口响应延迟飙升、并发堆积。
- 永远不要在
async def函数里裸调task.delay();必须包装进线程池:await anyio.to_thread.run_sync(task.delay, arg) - 禁用
task.get()—— 它是纯同步阻塞的;改用异步 HTTP client 轮询自己的/api/task-status/{task_id}接口 - Broker URL 加超时参数:
redis://127.0.0.1:6379/0?socket_timeout=1&socket_connect_timeout=1,避免 DNS 卡死整个协程调度器
最常被忽略的是:任务函数内部异常默认只打一行日志 Task xyz raised unexpected: ValueError(),调用方完全感知不到;务必在 task 内部加 try/catch 记录完整 traceback,或启用 task_track_started = True 配合日志定位。


















