Как стать автором
Обновить

Комментарии 11

НЛО прилетело и опубликовало эту надпись здесь
pystate pysta pystateй pystatой тачки
© Наггано
Спасибо за ваши труды по переводу!

Недавно столкнулся с тем, что в Python освобождение ресурсов дочернего процесса не гарантируется до смерти родительского процесса. Надеялся узнать что-нибудь о природе этого явления из статьи, но, к сожалению, ситуация не прояснилась.
Это вопрос к сборщику мусора :)
Что-то вы дивное рассказываете.
Можете привести подробности?
Python 2.7.3
Ubuntu 12.04 LTS

Задача: очень быстро разобрать 100 файлов размером по 50 мегабайт каждый.
Что сделано:
from multiprocessing import Pool, cpu_count
pool = Pool(processes=cpu_count())
result = pool.imap_unordered(parse_func, file_list)
collect_data_from_result(result)

Ожидание:
После отработки этого кода и сбора всех результатов в переменной result множественные процессы python умирают и освобождают память, захваченную во время обработки.

Что происходит на самом деле:
Освобождение памяти происходит лишь после завершения работы родительского процесса, в котором была вызвана обработка. Как и смерть дочерних процессов.

Я вполне допускаю, что мои ожидания были напрасны. Если Вы вдруг знаете ссылку на официальные доки по этому поводу, подскажите — с удовольствием почитаю.
Ага, это не просто дочерние процессы а multiprocessing.Pool, что несколько меняет дело.
pool.close()
pool.join()

делали?

Без этого pool дочерние процессы не закрывает.
Вот вам ссылка: docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.close
Без этого pool дочерние процессы не закрывает.

Я почему-то искренне был уверен, что они закроются, когда не останется ссылок на pool. В этом было моё заблуждение.

И, всё-таки, немного странно поведение. Если дочерние процессы выполнили все положенные им инструкции, а возможностей добавить новые нет, т.к. ссылок на pool не осталось, зачем держать эти процессы запущенными?
Ссылка на pool остается в главном процессе.
Дочерние не закрываются, потому что главный может добавить в pool еще работу после того как дочерние отработали предудущие задания. С точки зрения дочернего процесса без дополнительных инструкций не понять, предполагает ли главный процесс как-то еще использовать pool или нет.
Спасибо за объяснения.
По картинке я понял что внутри Python находится PHP.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий