Python的file.flush()在做什么?
我在File Objects的Python 文档中find了这个:
flush()不一定将文件的数据写入磁盘。 使用flush()后跟os.fsync()来确保这种行为。
所以我的问题是:Python的flush
干什么的? 我以为它迫使写入数据到磁盘,但现在我看到它没有。 为什么?
通常有两个级别的缓冲:
- 内部缓冲区
- 操作系统缓冲区
内部缓冲区是由您正在编程的运行时/库/语言创build的缓冲区,旨在通过避免每次写入的系统调用来加快速度。 相反,当你写入一个文件对象,你写入它的缓冲区,并且每当缓冲区填满,数据被写入到实际的文件使用系统调用。
但是,由于操作系统缓冲区,这可能不意味着数据写入磁盘 。 这可能意味着将数据从运行时维护的缓冲区复制到由操作系统维护的缓冲区中。
如果你写了一些东西,并且它只在缓冲区中结束,并且电源切断到你的机器上,那么当机器closures时,这些数据不在磁盘上。
所以,为了帮助你有flush
和fsync
方法,在它们各自的对象上。
第一个, flush
,只是将任何在程序缓冲区中的数据写出到实际的文件中。 通常这意味着数据将从程序缓冲区复制到操作系统缓冲区。
具体来说,这意味着如果另一个进程打开相同的文件进行读取,它将能够访问刚刷新到文件的数据。 但是,这并不一定意味着它已被“永久”存储在磁盘上。
为此,您需要调用os.fsync
方法,以确保所有操作系统缓冲区都与其所用的存储设备同步,换句话说,该方法会将数据从操作系统缓冲区复制到磁盘。
通常情况下,您不需要为任何一种方法而烦恼,但是如果您对于磁盘上实际结束的偏执狂是一件好事,那么您应该根据指示进行两次调用。
因为操作系统可能不这样做。 刷新操作强制文件数据进入RAM中的文件caching,并从那里操作系统的工作实际发送到磁盘。
它刷新内部缓冲区,这应该导致操作系统写出缓冲区的文件。[1] Python使用操作系统的默认缓冲,除非你configuration它否则。
但有时操作系统仍然select不合作。 特别是在Windows / NTFS的写入延迟方面。 基本上内部缓冲区是刷新,但操作系统缓冲区仍然坚持下去。 所以你必须告诉操作系统在这种情况下用os.fsync()
把它写到磁盘上。