Я использую 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?
pool.join()
после того,pool.close()
как запустил все потоки пула, но я не пробовал использовать егоpool.imap_unordered()
в качестве итеративного.Ответы:
Нет, нет, но, вероятно, это хорошая идея, если вы больше не собираетесь использовать бассейн.
Причины звонка,
pool.close
илиpool.join
они хорошо сказаны Тимом Питерсом в этом сообщении SO :источник
pool.close()
первым иpool.join()
вторым. Это позволяет вам добавлять работу междуpool.close()
иpool.join()
, не дожидаясь завершения выполнения пула.pool.close()
первым, это действительно обязательно. Из документов : Необходимо позвонитьclose()
илиterminate()
перед использованиемjoin()
.У меня была та же проблема с памятью, что и использование памяти с помощью Python multiprocessing.pool, когда я не использовал его,
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()
После закрытия и присоединения к пулу утечка памяти ушла.
источник
ERROR: Terminated with signal 15
до того, как добавил код очистки,pool.close();pool.join();
но после добавления этого кода очистки я не получаю сообщения консоли. поэтому я подозреваю, что, по крайней мере, в моей версии, python 2.7 от C7, пул, возможно, каким-то образом не очищался точно.