gpt4 book ai didi

参数列表中文件对象的python持续时间

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:26 25 4
gpt4 key购买 nike

pickle module documentation有一段示例代码:

reader = pickle.load(open('save.p', 'rb'))

第一次读取时看起来它会分配一个系统文件描述符,读取其内容,然后“泄漏”打开的描述符,因为没有任何可访问的句柄来调用 close()。这让我想知道是否有任何隐藏的魔法可以解决这个问题。

深入研究源代码,我在 Modules/_fileio.c 中发现文件描述符被 fileio_dealloc() 析构函数关闭,这导致了真正的问题。

上面示例代码使用的文件对象的持续时间是多少?在该语句执行之后,该对象是否确实变为未引用状态,因此 fd 是否会在未来的垃圾收集清理中受到真正的 close(2) 调用?如果是这样,示例行是好的做法,还是不应指望释放 fd 从而冒内核每个进程描述符表耗尽的风险?

最佳答案

What is the duration of the file object returned by the example code above?

该代码不会返回文件对象(正如 Q 的标题正确指出的那样,它将它作为参数接收)。

在当前的 CPython 中,文件将在函数返回时关闭(因为函数不会将对文件对象的任何引用隐藏到更持久的位置)。在其他实现中,文件将“最终”关闭,但没有指定确切的时间。

取决于 CPython 的立即关闭语义(当 future 的 CPython 转向更好的垃圾收集机制时,它可能会改变),虽然这是一种非常传统的方法,但不是最佳实践。

最好的做法是使用 with 语句:

with open(...) as f:
reader = pickle.load(f)

使用 this 时,文件的立即关闭(只要 with 语句的主体结束)在所有实现中都得到保证。

请注意,在 Python 2.5 中,您需要一个 from __future__ import with_statement 才能使用 with。在 2.6 或更高版本中,不需要这样的“从 future 导入”(它是无害的,但如果你知道你永远不会在 2.5 下运行它是多余的,最好删除)。

关于参数列表中文件对象的python持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com