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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

Другие вопросы по тегам