2015-04-28 4 views
2

Все, я пытаюсь «заставить» рабочих RQ выполнять одновременное использование supervisord. Моя настройка настройки супервизора, похоже, работает нормально, так как на rq-dashboard отображаются 3 рабочих, 3 PID и 3 очереди (по одному для каждого рабочего/PID). Настройка Supervisord следующим образом (показывая только настройки работника 1, более 2 рабочих определены ниже этого):RQ параллелизм с supervisord?

[program:rqworker1] 
command = rqworker 1 
process_name = rqworker1-%(process_num)s 
numprocs = 1 
user = username 
autostart = True 
stdout_logfile=/tmp/rqworker1.log 
stdout_logfile_maxbytes=50MB 

RQ workers running under supervisord

Вопрос в том, когда я посылаю 3 рабочих мест одновременно, общее время Запускаемая x3 для одной задачи (а именно, общее время линейно с количеством задач, это масштабируется до x4, x5 и т. д.). Кажется, что нет параллелизма. Я также реализовал примитивную балансировку нагрузки, отправив новые задания в очередь с минимальными начальными + заданиями в очереди, которые отлично работают (рабочие задания распределяются равномерно между очередями).

Почему эта настройка не разрешает параллелизм?

Какие-либо соображения относительно установки у меня отсутствуют?

Обратите внимание, что пакет rq-gevent-worker (который работал с более ранним w.r.t. concurrency/RQ) больше не доступен по мере перехода на PY3, а сам gevent еще не поддерживается на PY3. Но это дает мне понять, что параллелизм возможен.

+0

Возможно, вы загружаете все задания одному рабочему/очереди? –

+0

nah, я протестировал это; во-первых, каждый рабочий контролирует одну очередь, то, что я делаю, равномерно распределяет задания на три очереди (опять же, проверяется на работу), оттуда каждый рабочий должен обрабатывать только свои собственные задания. Но это не делается одновременно, так как время заканчивается линейно с количеством заданий. Если работает параллелизм, можно получить общее время = # Jobs/# Workers, предполагая, что задания распределены равномерно между очередями/рабочими. –

+2

Я использую 'supervisord' для запуска нескольких rqworkers параллельно. (Это не «сила», кстати, это [предполагаемый шаблон] (http://python-rq.org/patterns/supervisor/) в 'python-rq'.) С другой стороны, запись ваш собственный алгоритм балансировки нагрузки - это анти-шаблон: это именно то, что 'python-rq' делает для вас. Если вы хотите разделить работу между 3 работниками, то все они должны слушать одну и ту же очередь. Вы можете удалить 2 из ваших конфигурационных блоков супервизора и изменить 'numprocs' на' 3'. В противном случае информации недостаточно, чтобы знать, что не так: сколько процессоров? это привязка задачи IO или ЦП? –

ответ

1

Изменение мой комментарий сверху в ответ ...

Использование supervisord для запуска нескольких rqworker процессов параллельно в python-rqintended pattern, поэтому не беспокойтесь, что вы «принуждение " Это. У вас действительно есть правильная идея.

С другой стороны, написание собственного алгоритма балансировки нагрузки - это анти-шаблон: это именно то, что делает python-rq.

Если вы хотите разделить работу между тремя рабочими, то все они должны слушать одну и ту же очередь. Попробуйте удалить два из ваших конфигурационных блоков супервизора, а в одном оставшемся блоке измените значение numprocs на 3. Если вы быстро отправляете три задания в эту очередь, вы должны одновременно наблюдать за тремя рабочими.

 Смежные вопросы

  • Нет связанных вопросов^_^