Комментарии 11
НЛО прилетело и опубликовало эту надпись здесь
Спасибо за ваши труды по переводу!
Недавно столкнулся с тем, что в Python освобождение ресурсов дочернего процесса не гарантируется до смерти родительского процесса. Надеялся узнать что-нибудь о природе этого явления из статьи, но, к сожалению, ситуация не прояснилась.
Недавно столкнулся с тем, что в Python освобождение ресурсов дочернего процесса не гарантируется до смерти родительского процесса. Надеялся узнать что-нибудь о природе этого явления из статьи, но, к сожалению, ситуация не прояснилась.
+1
Это вопрос к сборщику мусора :)
0
Что-то вы дивное рассказываете.
Можете привести подробности?
Можете привести подробности?
0
Python 2.7.3
Ubuntu 12.04 LTS
Задача: очень быстро разобрать 100 файлов размером по 50 мегабайт каждый.
Что сделано:
Ожидание:
После отработки этого кода и сбора всех результатов в переменной result множественные процессы python умирают и освобождают память, захваченную во время обработки.
Что происходит на самом деле:
Освобождение памяти происходит лишь после завершения работы родительского процесса, в котором была вызвана обработка. Как и смерть дочерних процессов.
Я вполне допускаю, что мои ожидания были напрасны. Если Вы вдруг знаете ссылку на официальные доки по этому поводу, подскажите — с удовольствием почитаю.
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 умирают и освобождают память, захваченную во время обработки.
Что происходит на самом деле:
Освобождение памяти происходит лишь после завершения работы родительского процесса, в котором была вызвана обработка. Как и смерть дочерних процессов.
Я вполне допускаю, что мои ожидания были напрасны. Если Вы вдруг знаете ссылку на официальные доки по этому поводу, подскажите — с удовольствием почитаю.
+1
Ага, это не просто дочерние процессы а multiprocessing.Pool, что несколько меняет дело.
делали?
Без этого pool дочерние процессы не закрывает.
Вот вам ссылка: docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.close
pool.close()
pool.join()
делали?
Без этого pool дочерние процессы не закрывает.
Вот вам ссылка: docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.close
+2
Без этого pool дочерние процессы не закрывает.
Я почему-то искренне был уверен, что они закроются, когда не останется ссылок на pool. В этом было моё заблуждение.
И, всё-таки, немного странно поведение. Если дочерние процессы выполнили все положенные им инструкции, а возможностей добавить новые нет, т.к. ссылок на pool не осталось, зачем держать эти процессы запущенными?
+1
Ссылка на pool остается в главном процессе.
Дочерние не закрываются, потому что главный может добавить в pool еще работу после того как дочерние отработали предудущие задания. С точки зрения дочернего процесса без дополнительных инструкций не понять, предполагает ли главный процесс как-то еще использовать pool или нет.
Дочерние не закрываются, потому что главный может добавить в pool еще работу после того как дочерние отработали предудущие задания. С точки зрения дочернего процесса без дополнительных инструкций не понять, предполагает ли главный процесс как-то еще использовать pool или нет.
+2
По картинке я понял что внутри Python находится PHP.
+9
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Python изнутри. Структуры процесса