Запуск нескольких рабочих с использованием сельдерея

11

Мне нужно читать из Rabbitmq и параллельно выполнять задачу, используя Celery в одной системе.

[2014-12-30 15:54:22,374: INFO/Worker-1] ...   
[2014-12-30 15:54:23,401: INFO/Worker-1] ...
[2014-12-30 15:54:30,878: INFO/Worker-1] ...
[2014-12-30 15:54:32,209: INFO/Worker-1] ...
[2014-12-30 15:54:33,255: INFO/Worker-1] ...
[2014-12-30 15:54:48,445: INFO/Worker-1] ...
[2014-12-30 15:54:49,811: INFO/Worker-1] ...
[2014-12-30 15:54:50,903: INFO/Worker-1] ...
[2014-12-30 15:55:39,674: INFO/Worker-1] ...
[2014-12-30 15:55:41,024: INFO/Worker-1] ...
[2014-12-30 15:55:42,147: INFO/Worker-1] ...

Это швы, только 1 рабочий работает все время .. т.е. один за другим в последовательном порядке. Как я могу настроить Celery для запуска нескольких рабочих параллельно?

Src
источник

Ответы:

17

Теперь я обновил свой ответ после комментария от MartinP относительно рабочих процессов, порождающих дочерние процессы, а не потоки:

Сельдерей workerи worker processesразные вещи ( Прочтите это для справки ).

Когда рабочий запускается, он порождает определенное количество дочерних процессов.

Число этих процессов по умолчанию равно числу ядер на этом компьютере.

В Linux вы можете проверить количество ядер с помощью:

$ nproc --all

В противном случае вы можете указать это самостоятельно, например:

$ celery -A proj worker --loglevel=INFO --concurrency=2

В приведенном выше примере есть один работник, который сможет порождать 2 дочерних процесса. Обычно рекомендуется запускать по одному рабочему на машину, и значение параллелизма будет определять, сколько процессов будет выполняться параллельно, но если для запуска потребуется несколько рабочих, вы можете запустить их, как показано ниже:

$ celery -A proj worker -l info --concurrency=4 -n wkr1@hostname
$ celery -A proj worker -l info --concurrency=2 -n wkr2@hostname
$ celery -A proj worker -l info --concurrency=2 -n wkr3@hostname

Обратитесь к документации сельдерея для получения дополнительной информации

elnurcoot
источник
3
Параметр concurency не запускает потоки. Он запускает дочерние процессы по умолчанию, поэтому он обрабатывает задачи параллельно - docs.celeryproject.org/en/latest/reference/…
MartinP
Как параллелизм и потоки связаны друг с другом, если по умолчанию параллелизм равен количеству ядер машины, каким будет число потоков? Это настраивается?
Томас Джон
@ThomasJohn Я думаю, что число потоков по умолчанию - это число ядер машины. Как правило, вы хотите установить высокий флаг --concurrency для рабочих на основе потоков.
FragLegs
0

Я нашел это

http://docs.celeryproject.org/en/latest/reference/celery.html?highlight=parallel

Вы можете найти Canvas-примитивы там, где вы можете увидеть, как создавать группы для параллельного выполнения.

class celery.group (task1 [, task2 [, task3 [,… taskN]]]) Создает группу задач, которые должны выполняться параллельно.

В противном случае хорошим способом будет пойти на канал IRC и задать специальные вопросы. Обычно есть люди, которые знают это очень хорошо, и они могут помочь вам.

Рене Хёле
источник
0

Похоже, ваш работник просто запускает один процесс / поток. Вероятно, вам просто нужно добавить аргумент --concurrencyor-c при запуске работника для создания нескольких (параллельных) экземпляров работника.

celery -A proj worker -c 4
Джейми Б
источник