蟒持续时间

问题描述:

pickle module documentation有的示例代码片段:蟒持续时间

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

,其在第一读取看起来像是将分配系统文件描述符,读取其内容,然后“泄漏”开放描述符,因为没有可访问的任何句柄可以调用close()。这让我想知道是否有任何隐藏的魔法来处理这种情况。

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

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

什么是文件 对象的持续时间由示例代码以上 返回?

代码不回报文件对象(如Q的标题正确地说,它接受它作为参数)。

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

取决于CPython的即时封闭语义(当未来的CPython转向更好的垃圾收集机制时可能会发生变化),而传统方法并不是最佳实践。

相反,最好的做法是使用with声明:

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

随着这个使用,该文件的立即关闭(只要with语句体结束)在所有的实现保证。

请注意,在Python 2.5中,您需要from __future__ import with_statement才能使用with。在2.6或更高版本中,这样的“从未来导入”并不是必需的(这是无害的,但如果你知道你永远不会在2.5以下运行,那么它是多余的并且更好地移除)。

+0

非常感谢;你是对的,我的意思是“使用”而不是“返回”并编辑修复。 – msw 2010-03-23 04:20:02