что именно файл python.flush() делает?
Я нашел это в Python документация для файловых объектов:
flush () не обязательно записывает данные файла на диск. Используйте flush (), а затем os.fsync () для обеспечения такого поведения.
Итак, мой вопрос: что именно такое Python flush
делаешь? Я подумал, что было сил записывать данные на диск, но теперь я вижу, что это не так. Почему?
3 ответа:
обычно используется два уровня буферизации:
- внутренние буферы
- буфера операционной системы
внутренние буферы-это буферы, созданные средой выполнения / библиотекой / языком, на котором вы программируете, и предназначены для ускорения работы, избегая системных вызовов для каждой записи. Вместо этого при записи в объект file выполняется запись в его буфер, и всякий раз, когда буфер заполняется, данные записываются в фактический файл с помощью системный вызов.
однако из-за буферов операционной системы это может не означать, что данные записываются на диске. Это может просто означать, что данные копируются из буферов, поддерживаемых вашей средой выполнения, в буферы, поддерживаемые операционной системой.
если вы пишете что-то, и это заканчивается в буфере (только), и питание отключается на вашей машине, что данные не на диске, когда машина выключается.
Итак, чтобы помочь с что у вас есть
flush
иfsync
методы, на их соответствующих объектах.первый,
flush
, просто выпишет любые данные, которые задерживаются в буфере программы в фактический файл. Обычно это означает, что данные будут скопированы из буфера программы в буфер операционной системы.в частности, это означает, что если другой процесс имеет тот же файл, открытый для чтения, он сможет получить доступ к данным, которые вы только что сбросили в файл. Тем не менее, она не обязательно означает, что он был "постоянно" хранится на диске.
для этого вам нужно позвонить
os.fsync
метод, который обеспечивает синхронизацию всех буферов операционной системы с устройствами хранения, для которых они предназначены, другими словами, этот метод будет копировать данные из буферов операционной системы на диск.обычно вам не нужно беспокоиться ни с одним из методов, но если вы находитесь в сценарии, где паранойя о том, что на самом деле заканчивается на диске, это хорошо, вы должны принять оба звонка в соответствии с инструкциями.
добавление в 2018 году.
обратите внимание, что диски с механизмами кэша теперь гораздо более распространены, чем в 2013 году, поэтому теперь задействовано еще больше уровней кэширования и буферов. Я предположим эти буферы будут обрабатываться вызовами синхронизации/флеш, но я действительно не знаю.
потому что операционная система может этого не сделать. Операция flush заставляет данные файла в файловый кэш в ОЗУ, и оттуда это работа ОС, чтобы фактически отправить его на диск.
он сбрасывает внутренний буфер, который должен заставить ОС записать буфер в файл.[1] Python использует буферизацию ОС по умолчанию, если вы не настроите ее иначе.
но иногда ОС все же предпочитает не сотрудничать. Особенно с такими замечательными вещами, как задержки записи в Windows/NTFS. В основном внутренний буфер очищается, но буфер ОС все еще держится за него. Таким образом, вы должны сказать ОС, чтобы записать его на диск с
os.fsync()
в этих случаи.