что именно файл python.flush() делает?


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

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

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

3 115

3 ответа:

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

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

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

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

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

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

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

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

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

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


добавление в 2018 году.

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

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

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

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

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