Я использую простую очередь RabbitMQ для распределения задач по рабочим процессам. Каждый рабочий процесс использует пул из multiprocessing
экземпляров для одновременной работы над несколькими задачами, чтобы максимально использовать память и ЦП.
Проблема в том, что некоторые задачи занимают гораздо больше оперативной памяти, чем другие, так что рабочий процесс рухнет, если он запустит более одного экземпляра. Но пока рабочий работает над задачей с интенсивным использованием ОЗУ, я бы хотел, чтобы он работал над другими задачами с меньшим объемом ОЗУ, чтобы использовать остальные процессоры.
Одной из идей было бы использование нескольких очередей или тем, но мне интересно, каков рекомендуемый подход. Могу ли я отловить ошибки нехватки памяти до того, как они приведут к сбою процесса?
Каким будет правильный подход к решению этой проблемы?
[обновленное обновление]
Там вся система будет состоять из нескольких многоядерных машин, но на каждой многоядерной машине работает только одна рабочая программа, которая создает столько многопроцессорных экземпляров, сколько ядер. Разные машины должны быть независимы друг от друга, за исключением того, что они получают свои задачи из одной и той же очереди.
multiprocessing.Pool
. Это звучит как много тотальных процессов. Если у вас не столько ядер, сколько процессов, вы только замедляетесь (и тратите память). Кроме того, зачем иметь несколько рабочих процессов, если все они потребляют из одной и той же очереди, а затем отправляют работу еще одному рабочему процессу, который является частьюPool
? Почему бы не иметь один рабочий процесс, управляющий однимPool
? - person dano   schedule 29.07.2014