Jython:subprocess.Popen用完了文件描述符

时间:2010-10-13 20:09:08

标签: python file-io resources jython popen

我正在使用Python的Jython 2.51实现编写一个脚本,该脚本通过subprocess.Popen重复调用另一个进程,并使用PIPEstdoutstderr传递给父进程和stdin到子进程。经过几百次循环迭代后,我似乎用完了文件描述符。

Python subprocess documentation提及释放文件描述符的问题很少,close_fds选项除外,没有明确说明(为什么除了0,1和2之外还有任何文件描述符打开)第一名?)。我假设在CPython中,引用计数负责资源释放问题。在Jython中使用Popen对象完成后,确保释放所有描述符的正确方法是什么?

编辑:以防它有所不同,这是一个多线程程序,因此有几个Popen进程同时运行。

1 个答案:

答案 0 :(得分:3)

这只回答了你的部分问题,但我的理解是,当你产生一个新进程时,它通常会继承父进程的所有句柄。这包括你正在收听的打开文件和套接字等内容。

在UNIX上,这是使用'fork'的副作用,它在加载新的可执行文件之前复制当前进程及其所有句柄。在Windows上,它更明确,但无论如何,Python都会尝试尽可能地跨平台匹配行为。

close_fds选项,当为True时,在生成子进程后关闭所有这些继承的句柄,因此新的可执行文件以干净的平板开始。但是如果你的子进程一次运行一个,并在它们完成时终止,那么这应该不是问题。