Многопроцессорная обработка Python, использование пула несколько раз в цикле, застревает после первой итерации

1

У меня есть следующая ситуация, когда я создаю пул в цикле for следующим образом (я знаю, что это не очень элегантно, но я должен сделать это по причинам травления). Предположим, что pathos.multiprocessing эквивалентна библиотеке multiprocessing python (так как это зависит от некоторых деталей, которые не имеют отношения к этой проблеме). У меня есть следующий код, который я хочу выполнить:

self.pool = pathos.multiprocessing.ProcessingPool(number_processes)


for i in range(5):


    all_responses = self.pool.map(wrapper_singlerun, range(self.no_of_restarts))

    pool._clear()

Теперь моя проблема: цикл успешно запускает первую итерацию. Однако на второй итерации алгоритм внезапно останавливается (не pool.map операцию pool.map. Я подозревал, что процессы зомби сгенерированы или что процесс каким-то образом switched. Ниже вы найдете все, что я пробовал до сих пор.

for i in range(5):

    pool = pathos.multiprocessing.ProcessingPool(number_processes)

    all_responses = self.pool.map(wrapper_singlerun, range(self.no_of_restarts))

    pool._clear()

    gc.collect()

    for p in multiprocessing.active_children():
        p.terminate()
        gc.collect()

    print("We have so many active children: ", multiprocessing.active_children()) # Returns []

Вышеприведенный код отлично работает на моем Mac. Однако, когда я загружаю его в кластер, который имеет следующие спецификации, я получаю ошибку, которую он застревает после первой итерации:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"

Это ссылка на файл библиотеки многопроцессорной обработки пафоса.

  • 2
    Привет, я автор pathos . pathos.multiprocessing предоставляет расширенный Pool двумя способами: (1) лучшая сериализация и (2) инициализация. Если вы просто ищете лучшую сериализацию, я предлагаю вам использовать pathos.pools._ProcessPool , который имеет точный интерфейс и характеристики multiprocessing , но с лучшей сериализацией. Если вы ищете другие функции pathos , вы должны знать, что пулы pathos сохраняются, если они явно не уничтожены. Вы должны выполнить pool._clear или pool.restart для пула, который вы используете выше, чтобы уничтожить (или перезапустить) пул.
  • 0
    1.) Спасибо за отличную библиотеку! :) 2.), я попробовал pool._clear() в приведенном выше примере (я поставил его прямо перед pool = None , а все остальное оставил прежним). Тем не менее, он говорит мне, что ._clear() не является функцией-членом pathos.multiprocessing.Pool . Я также пытался вызвать ._clear() для pathos.pools._ProcessPool , что привело к той же ошибке
Показать ещё 9 комментариев
Теги:
multiprocessing
python-multiprocessing
pathos

1 ответ

0

Я предполагаю, что вы пытаетесь назвать это с помощью некоторой функции, которая не является правильным способом ее использования.

Вам необходимо обернуть его:

if __name__ == '__main__':
    for i in range(5):

         pool = pathos.multiprocessing.Pool(number_processes)

         all_responses = pool.map(wrapper_singlerun, 

range(self.no_of_restarts))

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

  • 0
    1.) так в чем разница name == " main "? к сожалению, это не то, что я могу применить, так как мой сценарий является просто модулем для другой библиотеки, которая контролирует, как выполняются мои функции. 2.) другая платформа, на которой не запускается, это не windows, а ubuntu (как отмечено в самом конце)
  • 0
    Ваш основной скрипт, тот, который вы вызываете первым, должен быть заключен в предложение if name == 'main' .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню