Django Celery delay() 总是推送到默认的“celery”队列

Kyl*_*ien 3 python django celery celery-task django-celery

我正在用这个扯掉我的头发。

我的问题的症结在于,CELERY_DEFAULT_QUEUE在我的 Django设置中使用settings.py我的任务不会强制我的任务进入我设置的特定队列。它总是进入celery我的经纪人的默认队列。

但是,如果我queue=proj:devshared_task装饰器中指定,它会进入正确的队列。它的行为符合预期。

我的设置如下:

  • 我本地主机上的 Django 代码(用于测试和其他东西)。.delay()通过 Django 的 shell ( manage.py shell)执行任务
  • 配置为我的代理的远程 Redis 实例
  • 在远程机器上配置的 2 名 celery 工作人员正在等待来自 Redis 的消息(在 Google App Engine 上 - 可能无关紧要)

注意:对于下面的代码片段,我隐藏了项目名称并用作proj占位符。

celery.py

from __future__ import absolute_import, unicode_literals

import os
from celery import Celery, shared_task

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

app.config_from_object('django.conf:settings', namespace='CELERY', force=True)

app.autodiscover_tasks()


@shared_task
def add(x, y):
    return x + y
Run Code Online (Sandbox Code Playgroud)

settings.py

...
CELERY_RESULT_BACKEND = 'django-db'
CELERY_BROKER_URL = 'redis://:{}@{}:6379/0'.format(
    os.environ.get('REDIS_PASSWORD'),
    os.environ.get('REDIS_HOST', 'alice-redis-vm'))
CELERY_DEFAULT_QUEUE = os.environ.get('CELERY_DEFAULT_QUEUE', 'proj:dev')
Run Code Online (Sandbox Code Playgroud)

这个想法是,就目前而言,我希望为我的代码所在的不同环境设置不同的队列:dev、staging、prod。因此,在 Google App Engine 上,我定义了一个基于单个 App Engine 服务传递的环境变量。

脚步

因此,通过上述配置,我使用./manage.py shell并运行shell 来启动 shell add.delay(2, 2)。我得到了AsyncResult回复,但 Redis 监视器清楚地显示一条消息已发送到默认celery队列:

1497566026.117419 [0 155.93.144.189:58887] "LPUSH" "celery"
...
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

不是在工作中投入扳手,但我觉得今天有一个点,这实际上是有效的。但是对于我的生活,我想不出我大脑的哪个部分在这里失败了。

堆栈版本:

  • python: 3.5.2
  • celery: 4.0.2
  • redis: 2.10.5
  • django: 1.10.4

Kyl*_*ien 7

这个问题比我想象的要简单得多——不正确的文档!!

Celery 文档要求我们用来CELERY_DEFAULT_QUEUE设置task_default_queuecelery 对象的配置。

参考:http : //docs.celeryproject.org/en/latest/userguide/configuration.html#new-lowercase-settings

我们目前应该使用CELERY_TASK_DEFAULT_QUEUE. 这是所有其他设置名称的命名不一致。它是在 Github 上提出的 - https://github.com/celery/celery/issues/3772

解决方案总结

使用CELERY_DEFAULT_QUEUE(使用配置模块中config_from_object)对队列中没有效果。

使用CELERY_TASK_DEFAULT_QUEUE来代替。