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

标签 python file-io resources jython popen

我正在使用 Python 的 Jython 2.51 实现来编写一个脚本,该脚本通过 subprocess.Popen 重复调用另一个进程,并使用 PIPE 来传输 stdoutstderr 到父进程, 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/

相关文章:

python - os.path.exists() 在 Windows 上的 %appdata% 中给出误报

c - 有什么方法可以反编译用古代编译器构建的二进制资源文件?

c# - 如何从后面的代码访问xaml中声明的全局变量

python - 如何创建一个新列,显示前 5 行和剩余行作为杂项?

Python组合和产品

c - 怪异的迪基文件

java - 如何找出 renameTo() 失败的原因?

javascript - 设置不同资源的优先级

python - 如何使用 Dask 将函数应用于大型数据集的单列?

python - 使用连字符传递关键字参数