Что именно делает python file.flush()?

Я нашел это в документации Python для файловых объектов:

flush() не обязательно записывает данные файлов на диск. Используйте flush(), за которым следует os.fsync(), чтобы обеспечить это поведение.

Итак, мой вопрос: что именно делает Python flush? Я думал, что он заставляет записывать данные на диск, но теперь я вижу, что это не так. Зачем?

Ответ 1

Обычно используется два уровня буферизации:

  1. Внутренние буферы
  2. Буферы операционной системы

Внутренние буферы - это буферы, создаваемые средой выполнения/библиотекой/языком, для которых вы программируете, и призваны ускорить процесс, избегая системных вызовов для каждой записи. Вместо этого, когда вы записываете в файловый объект, вы записываете в его буфер, и всякий раз, когда буфер заполняется, данные записываются в реальный файл с использованием системных вызовов.

Однако из-за буферов операционной системы это может не означать, что данные записываются на диск. Это может просто означать, что данные копируются из буферов, поддерживаемых вашей средой выполнения, в буферы, поддерживаемые операционной системой.

Если вы что-то пишете, и это попадает в буфер (только), и питание отключается на вашем компьютере, эти данные не сохраняются на диске, когда машина выключается.

Итак, чтобы помочь с этим, у вас есть методы flush и fsync для их соответствующих объектов.

Первый, flush, просто записывает любые данные, которые остаются в программном буфере, в текущий файл. Обычно это означает, что данные будут скопированы из буфера программы в буфер операционной системы.

В частности, это означает, что если другой процесс имеет тот же файл, открытый для чтения, он сможет получить доступ к данным, которые вы только что сбросили в файл. Однако это не обязательно означает, что он "постоянно" хранится на диске.

Для этого вам нужно вызвать метод os.fsync который гарантирует, что все буферы операционной системы синхронизированы с устройствами хранения, для которых они предназначены, другими словами, этот метод будет копировать данные из буферов операционной системы на диск.

Как правило, вам не нужно беспокоиться о любом из этих методов, но если вы находитесь в ситуации, когда паранойя о том, что на самом деле заканчивается на диске, является хорошей вещью, вы должны сделать оба вызова в соответствии с инструкциями.


Приложение в 2018 году.

Обратите внимание, что диски с механизмами кеширования стали гораздо более распространенными, чем в 2013 году, поэтому теперь существует еще больше уровней кеширования и буферов. Я предполагаю, что эти буферы также будут обрабатываться вызовами sync/flush, но я действительно не знаю.

Ответ 2

Потому что операционная система может этого не делать. Операция флеша заставляет данные файла в кэш файлов в ОЗУ, и оттуда он выполняет задание ОС, чтобы отправить его на диск.

Ответ 3

Он удаляет внутренний буфер, который должен заставить ОС записывать буфер в файл. [1] Python использует буферизацию по умолчанию ОС, если вы не настроили ее иначе.

Но иногда ОС по-прежнему предпочитает не сотрудничать. Особенно с замечательными вещами, такими как задержки записи в Windows/NTFS. В основном внутренний буфер сбрасывается, но буфер ОС по-прежнему держится за него. Таким образом, вы должны сообщить OS записать его на диск с os.fsync() в этих случаях.

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

Ответ 4

По сути, flush() очищает ваш буфер ОЗУ, его реальная сила в том, что он позволяет вам продолжать запись в него впоследствии - но это не следует считать лучшей или самой безопасной функцией записи в файл. Это сбрасывает вашу оперативную память все для большего количества данных. Если вы хотите обеспечить безопасную запись данных в файл, используйте вместо этого close().