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