2010-10-13 2 views
4

Я использую реализацию Python Jython 2,51 написать скрипт, который неоднократно вызывающую другой процесс с помощью subprocess.Popen и использует PIPE к трубе stdout и stderr к родительскому процессу и stdin к дочерний процесс. После нескольких сотен циклов итераций я, похоже, исчерпал дескрипторы файлов.Jython: subprocess.Popen исчерпывает файловых дескрипторов

Python subprocess documentation упоминает очень мало об освобождении дескрипторов файлов, отличных от close_fds опции, которые не описаны очень ясно (почему должен там быть никаких файловых дескрипторов, кроме 0, 1 и 2 открытых в первую очередь?). Я предполагаю, что в CPython подсчет ссылок заботится о проблеме освобождения ресурсов. Каков правильный способ убедиться, что все дескрипторы освобождаются, когда все делается с объектом Popen в Jython?

Редактировать: На всякий случай это имеет значение, это многопоточная программа, поэтому существует несколько процессов Popen, работающих одновременно.

ответ

3

Это только ответ на часть вашего вопроса, но я понимаю, что когда вы создаете новый процесс, он обычно наследует все дескрипторы родительского процесса. Это включает в себя такие вещи, как открытые файлы и сокеты, которые вы слушаете.

В UNIX это побочный эффект использования «fork», который дублирует текущий процесс и все его ручки перед загрузкой нового исполняемого файла. В Windows это более явный, но Python все равно, чтобы попытаться максимально соответствовать поведению на разных платформах.

Параметр close_fds, когда True, закрывает все эти унаследованные дескрипторы после нереста подпроцесса, поэтому новый исполняемый файл начинается с чистого листа. Но если ваши подпроцессы выполняются по одному и заканчиваются, когда они закончены, это не должно быть проблемой.