【问题标题】:Do I need to os.fsync() before f.close()?我需要在 f.close() 之前使用 os.fsync() 吗?
【发布时间】:2020-02-12 17:08:32
【问题描述】:

"what exactly the python's file.flush() is doing?" 表示您应该先f.flush() 然后os.fsync(f) 以确保将数据写入磁盘。
此外,"does close() imply flush() in Python?" 声称f.close() 意味着flush()

现在的问题是:我应该这样做

os.fsync(f)
f.close()

或者,f.close() 是否也意味着os.fsync()

这里是doc of Python IOdoc of Python file closesource code。快速搜索“fsync”没有返回相关信息。

【问题讨论】:

  • 可能所有人都只使用f.close(),并且没有人对保存的数据有任何问题。
  • @furas 是的。但是,当close() 返回时,我可以确定我的数据已完成保存到云端硬盘吗?

标签: python io flush fsync


【解决方案1】:

我通过跟踪测试脚本检查了自己,不,这并不意味着 fsync。 f.close() 意味着 f.flush() 因为它必须这样做。 f.flush() 写入内部 (用户空间)缓冲到关联的文件描述符,关闭文件描述符后您不能写入文件描述符。但是写入内核缓冲区并不能保证持久性,这就是 fsync 发挥作用的地方。

【讨论】:

  • 非常感谢。因此看起来我应该在显示“您现在可以关闭电源”之前先做fsync,对吧?
  • @DanielChin 关闭系统很可能还会使所有内核 I/O 缓冲持久化,但为了安全起见,您可能应该在没有重大性能问题的假设下强制执行 fsync。 :)
【解决方案2】:

我只尝试过 os.fsync() 然后 f.close() 和 os.fsync()。两者都将给出立即数据写入文件的相同结果。尽管主电源插座突然断电并稍后重新通电,但文件仍使用任一方法更新。

所以,当有 os.fsync() 时,f.close() 就没有必要了。

【讨论】:

  • 感谢您的回答。不过,官方是否记录了f.close 在写入磁盘后返回?
猜你喜欢
  • 2011-11-24
  • 2020-12-18
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2021-08-11
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多