You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:15:05