Jython: subprocess.Popen заканчивается файловыми дескрипторами - PullRequest
4 голосов
/ 14 октября 2010

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

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

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

1 Ответ

3 голосов
/ 14 октября 2010

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

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

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

...