Python: убить все процессы пула

У меня есть функция foo(), которая создает несколько объектов. Эта функция вызывается несколько раз во время выполнения моей программы. Чтобы ускорить мой код, я хочу заставить foo() создать набор процессов, которые вычисляют новые объекты параллельно.

def foo(self):
    pool = multiprocessing.Pool()
    self.nodes = pool.map(self._create_node, self.args)
    pool.close()
    pool.join()

 def _create_node(self, args):
        n = Node(args)
        return n

Теоретически это работает, но после нескольких вызовов foo() мой компьютер зависает. Думаю процессы не убиваются после моего звонка в foo(), хотя звоню закрываю и присоединяюсь. Что я делаю не так?

Если я убью программу из терминала, я получаю эту ошибку:

->File "threading.py", line 1070, in _wait_for_tstate_lock
    elif lock.acquire(block, timeout):

KeyboardInterrupt: 

Редактировать

Чтобы добавить еще немного информации, когда я запускаю программу, она изначально работает быстро, но со временем замедляется. По мере торможения программы потребление оперативной памяти возрастает, превышая мою оперативную память и заполняя своп. Без многопроцессорности вы вообще не заметите потребления оперативной памяти, так как программа действительно маленькая. htop показывает только от 1 до 4 процессов, запущенных одновременно.


person Natjo    schedule 30.06.2016    source источник


Ответы (1)


пытаться

def foo(self):
    with multiprocessing.Pool() as pool:
        result = pool.map_async(self._create_node, self.args)
        try:
             self.nodes = result.get(300) #get the result or throws a timeout exception after 300 seconds
        except:
             pool.terminate()

Вам не нужно закрывать() пул, так как он вызывается автоматически

отредактированный тайм-аут

person frank    schedule 30.06.2016
comment
Я попробовал ваш код, но это привело к той же проблеме. htop показывает мне страницы, полные моих исполнений на Python. - person Natjo; 30.06.2016
comment
Я попробовал ваше редактирование, но не могу остановить процесс, пока не получу результат. Как я могу убить процесс после того, как он закончил свои вычисления? - person Natjo; 30.06.2016
comment
просто удалите необязательный тайм-аут в get() и вызовите pool.terminate() после этого (не в блоке исключений). но я рекомендую установить тайм-аут - person frank; 30.06.2016
comment
Теперь мой компьютер больше не зависает. Тем не менее вычисление сильно замедляется, чем чаще вызывается foo(). - person Natjo; 30.06.2016
comment
Вы вызываете foo() асинхронно? - person frank; 30.06.2016
comment
вы можете ограничить процессы с помощью multiprocessing.Pool(processes=2) as pool: ..... - person frank; 30.06.2016
comment
Я вызываю foo() последовательно. Единственная многопроцессорность в моей программе происходит внутри foo(). - person Natjo; 30.06.2016
comment
сколько экземпляров вы создаете? может у тебя кончилась оперативка... думаю, это все, что я могу об этом сказать - person frank; 30.06.2016
comment
htop показывает мне 3 экземпляра моего скрипта Python. Они используют около 3 ГБ моей оперативной памяти, это слишком много по сравнению с тем, сколько использует однопоточная программа. - person Natjo; 30.06.2016