Многопроцессорная обработка Python, использование пула несколько раз в цикле, застревает после первой итерации - PullRequest
0 голосов
/ 06 июля 2018

У меня следующая ситуация, когда я создаю пул в цикле 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. Я подозревал, что процессы зомби сгенерированы или что процесс каким-то образом 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"

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

1 Ответ

0 голосов
/ 06 июля 2018

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

Вам нужно обернуть это с помощью:

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, а в Windows его нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...