Django Celery自定义任务路由不生效,如何将任务发送到指定队列?
问题原因及修复方案
你当前的配置存在几个常见错误,按以下步骤调整即可实现任务按规则分发到对应队列:
1. 修正任务调用的名称错误
你定义的任务函数名为long_task,但调用时写的是long.apply_async(),名称不匹配,调整为正确的调用方式:
long_task.apply_async()
2. 补全CELERY_ROUTES的任务全路径
Celery路由默认匹配任务的完整导入路径,比如你的任务定义在myapp/tasks.py下,路由配置需要写成:
CELERY_ROUTES = { # 替换为你实际的任务完整导入路径 'myapp.tasks.long_task': { 'queue': 'long' }, }
如果你不想写全路径,可以在任务装饰器中指定name参数固定任务名:
@app.task(name='long_task') def long_task(): # very long processing
此时你原来写的'long_task'路由规则才能生效。
3. 显式指定默认队列避免歧义
你配置里的注释询问是否需要定义默认队列,建议显式声明默认队列,减少配置歧义,在settings.py中加一行配置:
CELERY_DEFAULT_QUEUE = 'celery'
4. 可选备用方案:调用时显式指定队列
如果你不想配置全局路由,也可以在调用任务时直接指定队列,优先级高于全局路由配置:
long_task.apply_async(queue='long')
验证方式
启动worker时分别启动两个队列的消费进程,即可验证路由是否生效:
- 消费默认队列的worker:
celery -A 你的项目名 worker -Q celery -l info - 消费长任务队列的worker:
celery -A 你的项目名 worker -Q long -l info
触发任务后查看对应worker的日志,就能确认任务是否被分发到了正确队列。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

