Динамическое управление рабочим пулом в многопроцессорной среде Python - PullRequest
2 голосов
/ 01 февраля 2012

Что я хотел бы сделать, так это отслеживать, как используется системный ресурс, и динамически увеличивать / уменьшать количество работников в пуле.

У меня есть 24-ядерный узел с 48 ГБ ОЗУ, и я читаю в файле данных 4 ГБ, который мне нужно отфильтровать. Система также используется другими, поэтому доступная память меняется со временем. Поскольку входные данные 4 ГБ реплицируются на всех работников (мне еще предстоит найти способ, как этого избежать, так как они нужны мне только в режиме «только для чтения»), рекомендации приветствуются, это dict () из dicts () и списков ) это означает, что я не могу порождать 24 рабочих, так как у меня сразу кончается память. Поэтому я хотел бы запустить процесс, скажем, с безопасным числом из 6 рабочих, а затем наблюдать за использованием памяти и порождать дополнительных рабочих в пул, а если использование памяти становится высоким, уменьшите количество рабочих (т.е. дайте некоторым завершиться). , но не ставить новые задачи в этих рабочих больше). Таким образом, я мог бы максимально использовать узел, сохраняя при этом использование оперативной памяти <95%. </p>

Причина, по которой это будет эффективно, заключается в том, что весь код выполняется в течение нескольких часов даже с 6-12 параллельными работниками, поэтому, если я даже смогу на некоторое время увеличить количество работников на 20-30%, это уменьшит общее выполнение. время.

Прямо сейчас я использовал методы Pool.map () и Pool.apply_async () для отправки задач в пул, поэтому у меня нет прямых предпочтений, если один метод работает лучше, чем другой.

Заранее спасибо за рекомендации.

1 Ответ

3 голосов
/ 01 февраля 2012

Многопроцессорный модуль позволяет нескольким процессам делиться друг с другом :

manager = mp.Manager()
d = manager.dict()

Возможно, используя общий диктат, вы можете создать 24 рабочих и при этом использовать гораздо меньше памяти. Когда один работник получает доступ или изменяет его, другие рабочие блокируют его, если они также пытаются получить доступ или изменить его, но если это не является основным узким местом, возможность использовать 24 рабочих может значительно сократить время выполнения.

...