2013-11-08 2 views
27

Я пытаюсь сохранить несколько очередей сельдерея с разными задачами и работниками в одной и той же базе данных redis. На самом деле просто проблема удобства только для того, чтобы один redis-сервер, а не два на моей машине.Как сохранить несколько независимых очередей сельдерея?

Я следил за учебниками по сельдеристу дословно, так как это единственный способ заставить его работать на меня. Теперь, когда я пытаюсь дублировать все с слегка измененными именами/очередями, он продолжает выходить из строя.

Примечание. Я новичок в Python и Celery, что, очевидно, является частью проблемы. Я не уверен, какие части называются «задача/задачи» как имя или специальные слова.

Моя сокращенная версия документации: Запуск celery -A tasks worker для создания рабочих. tasks.py содержит код задачи с celery = Celery('tasks', broker='redis://localhost') для подключения к сельдерею и @task() над моими функциями, которые я хочу отложить.

В моей программе для очередей задач ...

from tasks import do_work 
do_work.delay() 

Поэтому, учитывая все вышесказанное, какие шаги мне нужно предпринять, чтобы превратить это в два типа задач, которые работают независимо друг от друга на отдельные очереди и рабочие? Например, blue_tasks и red_tasks?

Я попытался изменить все экземпляры задач на blue_tasks или red_tasks. Однако, когда я ставил очередь blue_tasks, работники red_tasks, с которых я начал, начинают пытаться работать с ними.

Я читал об очередях по умолчанию и таких, так что я попробовал этот код, который не работал:

CELERY_DEFAULT_QUEUE = 'red' 
CELERY_QUEUES = (
    Queue('red', Exchange('red'), routing_key='red'), 
) 

Как примечание стороны, я не понимаю, почему celery worker ошибки вне с сельдереем пытается подключиться к экземпляру amqp по умолчанию, в то время как celery -A tasks worker сообщает, что сельдерей подключается к Redis. Какой код задачи celery worker пытается запустить на рабочем месте, если ничего не указано?

ответ

43

По умолчанию все идет в очередь по умолчанию с именем celery (и это то, что celery worker будет обрабатывать, если не указано никакой очереди)

Так что у вас есть ваша функция do_work задачи в django_project_root/myapp/tasks.py.

Можно настроить do_work задачи жить в своей собственной очереди, как так:

CELERY_ROUTES = { 
    'myproject.tasks.do_work': {'queue': 'red'}, 
} 

Затем запустите работник, используя celery worker -Q red и он будет обрабатывать только вещи в этой очереди (другой рабочий вызывается с celery worker только пикапом вещи в очереди по умолчанию)

Секция в документации должна объяснять все.

+0

Я не мог проверить это, но это звучит разумно. Я закончил рефакторинг моего кода, чтобы две разные задачи были обобщены в одну функцию, поэтому я мог хранить все в одной очереди. Оказалось, что это хорошее решение с точки зрения управления кодами. – jwoww

+2

Не забудьте передать queue = "red" в apply_sync, несмотря на это значение CELERY_ROUTES, задача будет отправлена ​​в очередь по умолчанию «сельдерей». Когда вы используете CELERY_ROUTES, я думаю, что неплохо также указать значение CELERY_DEFAULT_QUEUE = 'celery' по умолчанию (и, возможно, изменить его вместо передачи информации о очереди в apply_async). –

+1

@ DominiquePERETTI Я никогда не видел этого поведения, если вы не ссылаетесь на имя задачи правильно в своих 'CELERY_ROUTES'. – woot

7

Для ссылки на другую очередь динамически, выполните следующие действия:

1) Укажите имя очереди с «очереди» атрибут

celery.send_task('job1', args=[], kwargs={}, queue='queue_name_1') 
celery.send_task('job1', args=[], kwargs={}, queue='queue_name_2') 

(Здесь конкретная работа использует две очереди)

2) Добавьте следующую запись в файле конфигурации

CELERY_CREATE_MISSING_QUEUES = True 

3) При запуске работника, используйте -Q указать имя очереди», из которых рабочие места потребляться

celery -A proj worker -l info -Q queue1 
celery -A proj worker -l info -Q queue2 
Смежные вопросы