IT-Swarm.Net

python的file.flush()到底在做什么?

我在Python 文件对象的文档中找到了这个

flush()不一定将文件的数据写入磁盘。使用flush()后跟os.fsync()来确保此行为。.

所以我的问题是:Python的flush到底在做什么?我认为它强制将数据写入磁盘,但现在我发现它没有。为什么?

122
geek

通常涉及两个级别的缓冲:

  1. 内部缓冲区
  2. 操作系统缓冲区

内部缓冲区是由您编程的运行时/库/语言创建的缓冲区,旨在通过避免每次写入的系统调用来加快速度。相反,当您写入文件对象时,您会写入其缓冲区,并且只要缓冲区填满,就会使用系统调用将数据写入实际文件。.

但是,由于操作系统缓冲区,这可能并不意味着数据写入 磁盘 。它可能只是意味着数据从运行时维护的缓冲区复制到操作系统维护的缓冲区中。.

如果您写了一些内容,并且它最终在缓冲区中(仅限),并且电源被切断到您的机器,那么当机器关闭时,该数据不在磁盘上。.

因此,为了帮助您在各自的对象上使用flushfsync方法。.

第一个flush将简单地将任何在程序缓冲区中存在的数据写入实际文件。通常,这意味着数据将从程序缓冲区复制到操作系统缓冲区。.

具体来说,这意味着如果另一个进程打开同一个文件进行读取,它将能够访问刚冲刷到该文件的数据。但是,它并不一定意味着它已“永久”存储在磁盘上。.

为此,您需要调用os.fsync方法,以确保所有操作系统缓冲区与它们所用的存储设备同步,换句话说,该方法将数据从操作系统缓冲区复制到磁盘。.

通常情况下,您不需要为任何一种方法而烦恼,但是如果您处于一种偏执,关于实际上最终存在于磁盘上的内容是一件好事,您应该按照指示进行两次调用。.


2018年增编。.

请注意,具有缓存机制的磁盘现在比2013年更常见,因此现在涉及更多级别的缓存和缓冲区。我 假设 这些缓冲区也将由同步/刷新调用处理,但我真的不知道。.

198

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

因为操作系统可能不会这样做。刷新操作强制将文件数据放入RAM中的文件高速缓存中,从那里开始实际将操作系统发送到磁盘。.

9
Ignacio Vazquez-Abrams

它会刷新内部缓冲区,这应该会导致操作系统将缓冲区写入文件。[1] Python使用操作系统的默认缓冲,除非您另行配置。.

但有时操作系统仍然选择不合作。尤其是像Windows/NTFS中的写延迟这样的精彩内容。基本上内部缓冲区已刷新,但OS缓冲区仍然保持不变。因此,在这些情况下,您必须告诉操作系统使用os.fsync()将其写入磁盘。.

[1] http://docs.python.org/library/stdtypes.html

6
Dan

基本上,flush()清除了你的RAM缓冲区,它的真正强大之处在于它可以让你继续写入它 - 但它不应该被认为是最好/最安全的写入文件功能。它正在刷新RAM以获取更多数据,这就是全部。如果要确保数据安全地写入文件,请改用close()。.

0
zA.