Django集成Redis做Celery Broker时调用app.delay()持续等待无响应如何排查
问题根因及修复方案
核心问题定位
你当前配置里强制开启了Celery同步执行模式,完全禁用了异步能力,这是请求一直卡住的直接原因:
base_settings.py中配置了CELERY_ALWAYS_EAGER = Truecelery.py中额外配置了task_always_eager=True
该参数的作用是让所有delay()调用的任务直接在Django请求进程中同步执行,不会发送到Redis队列、也不会交由Worker处理,一旦任务出现异常/阻塞就会直接卡住接口响应。
其他兼容&规范问题
- Windows环境下Celery 5.x版本默认的prefork并发池不兼容,你当前启动命令用的prefork模式会导致Worker无法正常消费任务
- 异步任务直接定义在
views.py不符合规范,且任务名带空格容易引发识别异常 - 从
request.GET获取的参数是字符串类型,直接做加法运算会触发类型错误
逐步修复步骤
关闭同步执行模式
- 删除
base_settings.py中的CELERY_ALWAYS_EAGER = True配置项,或修改为CELERY_ALWAYS_EAGER = False - 修改
celery.py中的配置更新代码,移除同步执行配置:
# 修改前 app.conf.update(timezone='Asia/Kolkata', task_always_eager=True) # 修改后 app.conf.update(timezone='Asia/Kolkata')- 删除
修复Windows下Celery启动配置
- 先安装兼容Windows的并发依赖:
pip install eventlet - 替换Worker启动命令,指定并发池为eventlet:
celery -A lylo worker --loglevel=info -c 5 -P eventlet- 先安装兼容Windows的并发依赖:
规范异步任务定义
在你已注册到INSTALLED_APPS的对应应用下新建tasks.py文件,将任务迁移到该文件中,使用shared_task装饰器:from celery import shared_task @shared_task(name="test_celery_add") def add(a, b): # 提前做类型转换避免运算错误 a = int(a) b = int(b) print(a, b, a + b) return a + b之后在
views.py中导入该任务调用即可,不要在视图文件中定义异步任务。重启服务验证
依次重启Django服务、Celery Worker,重新调用接口后即可在Worker日志中看到任务执行记录,接口会正常返回响应。
内容的提问来源于stack exchange,提问作者krishna
相关产品推荐
相关产品推荐

