【问题标题】:Is it worth closing files in small functions?是否值得在小函数中关闭文件?
【发布时间】:2012-07-09 16:41:07
【问题描述】:

假设你有:

def my_func():
    fh = open(...)
    try:
        print fh.read()
    finally:
        fh.close()

我的第一个问题是:使用 try/finally(或 with)语句是否值得?当函数终止时(通过垃圾收集)文件是否仍然关闭?

我在阅读 Martelli 的“python 食谱”中的食谱后发现了这一点

all_the_text = open('thefile.txt').read()

附带评论:“当你这样做时,一旦读取操作完成,你就不再拥有对文件对象的引用。实际上,Python 会立即注意到缺少引用,并立即关闭文件。”

我的函数示例几乎相同。您确实有参考,只是参考的寿命很短。

我的第二个问题是:Martelli 声明中的“立即”是什么意思?即使您根本没有引用,文件关闭也不会在垃圾收集时发生吗?

【问题讨论】:

  • 我不会说你的例子是相似的。您将文件分配给变量fh,而open('thefile.txt').read() 只是在创建引用时直接使用read,而不保存它。我想这就是他立即的意思

标签: python file garbage-collection


【解决方案1】:

最好自己关闭文件。使用with 语句会产生干净的代码并自动关闭文件(这是一件好事)。

即使 Python 是一种高级编程语言,您仍然需要控制自己在做什么。根据经验:如果您打开一个文件,它也需要关闭。没有充分的理由在你的代码中马虎:-)

关于你的第二个问题:它不会立即运行,它会在垃圾收集器决定运行时运行。当文件对象被释放时,Python 将关闭文件。这里有somearticles关于 Python 垃圾收集的内容(另见gc 模块),读起来很有趣。

它还表明 Python 的垃圾收集在决定进行垃圾收集之前使用了一个基于已分配和释放对象数量的阈值。如果您的文件很大,那么 Python 可能会保持文件打开的时间超过必要的时间,因为垃圾收集代码可能尚未运行。

【讨论】:

  • 很公平。对我来说更有趣的是幕后发生的事情以及引用计数下降到 0 后会发生什么。请参阅我的编辑(包含关于 Martelli 的“立即”声明的第二个问题)。
  • 你可能应该注意到CPython混合使用了引用计数和垃圾收集,所以在简单的情况下,垃圾会在最后一个引用被销毁时立即收集。
猜你喜欢
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2011-05-11
  • 2020-10-22
  • 2020-05-09
  • 2013-02-03
相关资源
最近更新 更多