我正在使用 Python 的 Jython 2.51 实现来编写一个脚本,该脚本通过 subprocess.Popen
重复调用另一个进程,并使用 PIPE
来传输 stdout
和 stderr
到父进程, stdin
到子进程。在数百次循环迭代之后,我似乎用完了文件描述符。
Python subprocess documentation除了 close_fds
选项外,很少提及释放文件描述符,该选项描述得不是很清楚(为什么首先要打开 0、1 和 2 之外的任何文件描述符?)。我假设在 CPython 中,引用计数会处理资源释放问题。在 Jython 中使用 Popen
对象时确保释放所有描述符的正确方法是什么?
编辑:以防万一,这是一个多线程程序,因此有多个 Popen
进程同时运行。
最佳答案
这只回答了你的部分问题,但我的理解是,当你生成一个新进程时,它通常会继承父进程的所有句柄。这包括您正在监听的打开文件和套接字等内容。
在 UNIX 上,这是使用“fork”的副作用,它会在加载新的可执行文件之前复制当前进程及其所有句柄。在 Windows 上它更明确,但 Python 仍然这样做,以尝试尽可能跨平台匹配行为。
当 close_fds 选项为 True 时,在生成子进程后关闭所有这些继承的句柄,因此新的可执行文件从一个干净的平板开始。但是,如果您的子流程一次运行一个,并在完成时终止,那么这应该不是问题。
关于python - Jython:subprocess.Popen 用完文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927595/