У меня есть следующая ситуация, когда я создаю пул в цикле 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"
Это ссылка на файл библиотеки многопроцессорной обработки пафоса.
Я предполагаю, что вы пытаетесь назвать это с помощью некоторой функции, которая не является правильным способом ее использования.
Вам необходимо обернуть его:
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, а в окнах ее нет.
if name == 'main'
.
pathos
.pathos.multiprocessing
предоставляет расширенныйPool
двумя способами: (1) лучшая сериализация и (2) инициализация. Если вы просто ищете лучшую сериализацию, я предлагаю вам использоватьpathos.pools._ProcessPool
, который имеет точный интерфейс и характеристикиmultiprocessing
, но с лучшей сериализацией. Если вы ищете другие функцииpathos
, вы должны знать, что пулыpathos
сохраняются, если они явно не уничтожены. Вы должны выполнитьpool._clear
илиpool.restart
для пула, который вы используете выше, чтобы уничтожить (или перезапустить) пул.pool._clear()
в приведенном выше примере (я поставил его прямо передpool = None
, а все остальное оставил прежним). Тем не менее, он говорит мне, что._clear()
не является функцией-членомpathos.multiprocessing.Pool
. Я также пытался вызвать._clear()
дляpathos.pools._ProcessPool
, что привело к той же ошибке