Когда следует называть multiprocessing.Pool.join?

Я использую 'multiprocess.Pool.imap_unordered' как следующий

from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
    do some additional processing on mapped_result

Мне нужно вызвать pool.close или pool.join после цикла for?

Ответы

Ответ 1

Нет, нет, но это, вероятно, хорошая идея, если вы больше не собираетесь использовать пул.

Причины для вызова pool.close или pool.join хорошо сказано Тимом Петерсом в этом сообщении SO:

Что касается Pool.close(), вы должны называть это когда - и только когда - вы никогда не будете отправлять больше работы экземпляру Pool. Так что Pool.close() обычно вызывается, когда заканчивается параллелизуемая часть вашей основной программы. Затем рабочие процессы завершатся, когда завершена все работа, уже назначенная.

Это также отличная практика, чтобы вызвать Pool.join(), чтобы ждать завершения рабочих процессов. Среди других причин часто нет хорошего способа сообщать исключения в параллельном коде (исключения встречаются в контексте, только неопределенно связанным с тем, что делает ваша основная программа), а Pool.join() предоставляет точку синхронизации, которая может сообщать о некоторых случаях, которые произошли в рабочих процессах, которые вы в противном случае никогда не видели.

Ответ 2

У меня была такая же проблема с памятью, как Использование памяти продолжалось расти с помощью многопроцессорного_процесса Python, когда я не использовал pool.close() и pool.join() при использовании pool.map() с функцией, которая рассчитала расстояние Левенштейна. Функция работала нормально, но не правильно собиралась мусор на машине Win7 64, и использование памяти постоянно выходило из-под контроля каждый раз, когда вызывалась функция до тех пор, пока она не снизила всю операционную систему. Вот код, который фиксировал утечку:

stringList = []
for possible_string in stringArray:
    stringList.append((searchString,possible_string))

pool = Pool(5)
results = pool.map(myLevenshteinFunction, stringList)
pool.close()
pool.join()

После закрытия и объединения пула утечка памяти исчезла.