RQ параллелизм с супервизором?
Все, я пытаюсь "заставить" сотрудников RQ работать параллельно, используя supervisord. Моя настройка супервизора установки, кажется, работает нормально, так как rq-dashboard показывает 3 рабочих, 3 PID и 3 очереди (по одной на каждого работника /PID). Настройка супервизора выглядит следующим образом (показаны настройки только для рабочего 1, под ним определено еще 2 рабочих):
[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
Проблема заключается в том, что когда я отправляю 3 задания одновременно, общее время выполнения составляет х3 от времени одной задачи (а именно, общее время линейно с количеством задач, оно масштабируется до х4, х5 и т. Д.). Кажется, нет параллелизма. Я также реализовал примитивную балансировку нагрузки, посылая новые задания в очередь с минимальным количеством запущенных + поставленных в очередь заданий, что прекрасно работает (наблюдается равномерное распределение заданий между очередями).
Почему эта настройка не разрешает параллелизм?
Какие-нибудь соображения относительно установки, которую я пропускаю?
Обратите внимание, что пакет rq-gevent-worker (который отлично работал раньше при параллельном /RQ) больше не доступен, поскольку я перешел на PY3, а сам gevent еще не поддерживается на PY3. Но это дает мне понять, что параллелизм возможен.
1 ответ
Изменение моего комментария сверху в ответ...
С помощью supervisord
запустить несколько rqworker
параллельные процессы является намеченным паттерном в python-rq
так что не беспокойтесь, что вы "заставляете" это. У вас действительно есть правильная идея.
С другой стороны, написание собственного алгоритма балансировки нагрузки является анти-паттерном: это именно то, что python-rq
делает для вас.
Если вы хотите разделить работу между тремя работниками, то все они должны слушать одну и ту же очередь. Попробуйте удалить два из ваших блоков конфигурации супервизора, и в одном оставшемся блоке измените numprocs
в 3
, Если вы быстро отправите три задания в эту очередь, вы должны увидеть одновременное выполнение трех работников.