Заглянув под капот, я понял, что Worker
класс уже реализует многопроцессорность.
Функция work
внутренне вызывает execute_job(job, queue)
, что в свою очередь, как указано в модуле
Создает рабочую лошадь для выполнения фактической работы и передает ей работу.
Рабочий будет ждать рабочей лошади и следить за тем, чтобы она выполнялась в заданных пределах времени ожидания,
или закончит рабочую лошадь с помощью SIGALRM.
Функция execute_job()
неявно вызывает fork_work_horse(job, queue)
, который порождает рабочую лошадь для выполнения фактической работы и передает ей задание согласно следующей логике:
def fork_work_horse(self, job, queue):
child_pid = os.fork()
os.environ['RQ_WORKER_ID'] = self.name
os.environ['RQ_JOB_ID'] = job.id
if child_pid == 0:
self.main_work_horse(job, queue)
else:
self._horse_pid = child_pid
self.procline('Forked {0} at {1}'.format(child_pid, time.time()))
main_work_horse
выполняет внутренний вызов perform_job(job, queue)
, который выполняет несколько других вызовов для фактического выполнения задания.
Все шаги по жизненному циклу работника, упомянутые на официальной странице документации rq , выполняются в рамках этих вызовов.
Это не многопроцессорная обработка, которую я ожидал, но я думаю, у них есть способ сделать что-то. Однако на мой оригинальный пост до сих пор нет ответа, также я все еще не уверен в параллельности ..
Над документацией еще нужно поработать, поскольку она едва ли охватывает истинную сущность этой библиотеки!