2010-10-13 41 views
4

J'utilise le Jython 2,51 Python mise en œuvre de d'écrire un script qui appelle à plusieurs reprises par un autre processus subprocess.Popen et utilise PIPE pour tuyau stdout et stderr au processus parent et stdin à la processus de l'enfant. Après plusieurs centaines d'itérations de boucle, il me semble manquer de descripteurs de fichiers.Jython: subprocess.Popen court de descripteurs de fichiers

Le Python subprocess documentation mentionne très peu sur la libération des descripteurs de fichiers, autres que l'option close_fds, qui n'est pas décrit très clairement (Pourquoi devrait-il y avoir de descripteurs de fichiers en plus 0, 1 et 2 ouvert en premier lieu?). Je suppose que dans CPython, le comptage des références prend en charge le problème de la libération des ressources. Quelle est la bonne façon de s'assurer que tous les descripteurs sont libérés quand on en a fini avec un objet Popen dans Jython? Editer: Juste au cas où cela ferait une différence, il s'agit d'un programme multithread, donc il y a plusieurs processus Popen qui s'exécutent simultanément.

Répondre

3

Cela ne répond qu'à une partie de votre question, mais je crois comprendre que lorsque vous créez un nouveau processus, il hérite normalement de tous les descripteurs du processus parent. Cela inclut des choses telles que les fichiers ouverts et les sockets que vous écoutez.

Sous UNIX, c'est un effet secondaire d'utiliser 'fork', qui duplique le processus en cours et toutes ses poignées avant de charger le nouvel exécutable. Sous Windows, c'est plus explicite, mais Python le fait quand même, pour essayer de faire correspondre le plus possible le comportement entre plates-formes. L'option close_fds, lorsque True, ferme tous ces descripteurs hérités après la génération du sous-processus, de sorte que le nouvel exécutable démarre avec une table propre. Mais si vos sous-processus sont exécutés un à la fois et se terminent quand ils sont terminés, cela ne devrait pas être le problème.