蟒持续时间
问题描述:
在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以下运行,那么它是多余的并且更好地移除)。
非常感谢;你是对的,我的意思是“使用”而不是“返回”并编辑修复。 – msw 2010-03-23 04:20:02