Jython: subprocess.Popen 文件描述符耗尽
我正在使用 Jython 2.51 版本的 Python 来写一个脚本,这个脚本会不断地通过 subprocess.Popen
调用另一个进程,并使用 PIPE
将 stdout
(标准输出)和 stderr
(错误输出)传递给父进程,同时将 stdin
(标准输入)传递给子进程。经过几百次循环后,我似乎用完了文件描述符。
Python 的 subprocess 文档 对于释放文件描述符的内容提得很少,除了提到 close_fds
这个选项,但说明得也不太清楚(为什么除了 0、1 和 2 之外还会有其他打开的文件描述符呢?)。我猜在 CPython 中,引用计数会处理资源释放的问题。那么在 Jython 中,确保在使用完 Popen
对象后所有描述符都被释放的正确方法是什么呢?
补充说明:为了防止影响,这个程序是多线程的,所以有几个 Popen
进程同时在运行。
1 个回答
3
这段话只回答了你问题的一部分,但我的理解是,当你创建一个新进程时,它通常会继承父进程的所有句柄。这些句柄包括打开的文件和你正在监听的网络连接。
在UNIX系统中,这种情况是使用'fork'命令的副作用,它会复制当前进程及其所有句柄,然后再加载新的可执行文件。在Windows系统中,这个过程更明确,但Python还是会这样做,以尽量让不同平台上的行为一致。
当close_fds选项设置为True时,它会在创建子进程后关闭所有这些继承的句柄,这样新的可执行文件就可以从一个干净的状态开始。但是,如果你的子进程是一个接一个地运行,并且在完成后就结束,那么这应该不是问题。