【问题标题】:How to track total number of open files / file descriptors in Python如何在 Python 中跟踪打开文件/文件描述符的总数
【发布时间】:2019-11-28 21:55:23
【问题描述】:

我有一个迭代一堆寄存器的代码。它打开一些文件描述符,唯一目的是消除由外部库触发的消息。文件描述符的打开方式:

import sys
import os
...
with open(os.devnull, 'w') as devnull:
    oldstderr_fno = os.dup(sys.stderr.fileno())
    os.dup2(devnull.fileno(), 2)
    # here I call the noisy external library
    os.dup2(oldstderr_fno, 2)
    del oldstderr_fno

如果迭代次数很少,代码运行良好。当我尝试遍历整个数据集时,我最终得到了错误:

OSError: [Errno 24] Too many open files

我怀疑该错误来自我对外部库调用进行静音的方式。

我试图通过以下输出来跟踪我未能关闭文件描述符的位置:

import psutil
open_fd = len(psutil.Process().open_files())
print("Open FDs: %d" % open_fd)

但是报告的打开文件的数量是恒定的(只有 2 个,正如代码的其他部分所预期的那样)。

问题(非常欢迎任何答案):

  1. 还有其他更简洁的方法可以使嘈杂的外部库静音吗?
  2. 我是否打开了一些文件描述符?它应该被 with 子句关闭,对吧?
  3. 关于如何在 Python 中跟踪泄漏的文件描述符还有其他建议吗?

【问题讨论】:

  • 文件描述符只是ints 和del oldstderr_fno 不会关闭文件,你必须os.close() 它。不知道为什么open_files() 没有列出它。
  • os.close 的好建议。它解决了这个问题!非常感谢!

标签: python python-3.x file-descriptor


【解决方案1】:

根据 Tavian Barnes 提供的宝贵意见,我找到了一个解决方案,即显式关闭文件描述符,以便第一块代码变为:

import sys
import os
...
with open(os.devnull, 'w') as devnull:
    oldstderr_fno = os.dup(sys.stderr.fileno())
    os.dup2(devnull.fileno(), 2)
    # here I call the noisy external library
    os.dup2(oldstderr_fno, 2)
    os.close(oldstderr_fno)                # <-- new line that really closes the fd
    del oldstderr_fno

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多