Jython: subprocess.Popen se queda sin descriptores de archivos

Estoy usando la implementación Jython 2.51 de Python para escribir un script que invoca repetidamente otro proceso a través de subprocess.Popen y usa PIPE para canalizar stdout y stderr al proceso principal y stdin al proceso secundario. Después de varios cientos de iteraciones de bucle, parece que me he quedado sin descriptores de archivos.

La documentación del subproceso de Python menciona muy poco acerca de la liberación de descriptores de archivos, aparte de la opción close_fds , que no se describe muy claramente (¿por qué debería haber ningún descriptor de archivos además de 0, 1 y 2 abiertos en primer lugar?). Supongo que en CPython, el conteo de referencias se encarga del problema de la liberación de recursos. ¿Cuál es la forma correcta de asegurarse de que todos los descriptores se liberen cuando se realiza uno con un objeto Popen en Jython?

Edit: En caso de que haga una diferencia, este es un progtwig multiproceso, por lo que hay varios procesos de Popen que se ejecutan simultáneamente.

Esto solo responde a parte de su pregunta, pero mi entendimiento es que, cuando genera un nuevo proceso, normalmente hereda todos los manejadores del proceso principal. Eso incluye cosas como archivos abiertos y sockets que estás escuchando.

En UNIX, eso es un efecto secundario de usar ‘fork’, que duplica el proceso actual y todos sus controles antes de cargar el nuevo ejecutable. En Windows es más explícito, pero Python lo hace de todos modos, para tratar de igualar el comportamiento en las plataformas tanto como sea posible.

La opción close_fds, cuando es Verdadero, cierra todos estos controles heredados después de generar el subproceso, por lo que el nuevo ejecutable comienza con una pizarra limpia. Pero si sus subprocesos se ejecutan de uno en uno y terminan cuando terminan, entonces este no debería ser el problema.