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

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

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

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

3 ответов


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

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

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

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

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

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

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

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

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

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


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

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


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


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

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

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