【问题标题】:Jython: subprocess.Popen runs out of file descriptorsJython:subprocess.Popen 用完文件描述符
【发布时间】:2010-10-14 06:25:58
【问题描述】:

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

Python subprocess documentation 几乎没有提到释放文件描述符,除了 close_fds 选项之外,没有很清楚地描述(为什么首先要打开除了 0、1 和 2 之外的任何文件描述符? )。我假设在 CPython 中,引用计数会处理资源释放问题。在 Jython 中使用 Popen 对象完成后,确保释放所有描述符的正确方法是什么?

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

【问题讨论】:

    标签: python file-io resources jython popen


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 2011-10-30
      • 1970-01-01
      相关资源
      最近更新 更多