Зазвичай передбачається два рівні буферизації:
- Внутрішні буфери
- Буфери операційної системи
Внутрішні буфери - це буфери, створені програмою виконання / бібліотекою / мовою, проти якої ви програмуєте, і призначені для прискорення роботи, уникаючи системних викликів для кожного запису. Натомість, коли ви пишете в файл-об’єкт, ви записуєте його в буфер, і коли буфер заповнюється, дані записуються у фактичний файл за допомогою системних викликів.
Однак через буфери операційної системи це може не означати, що дані записуються на диск . Це може просто означати, що дані копіюються з буферів, що підтримуються під час виконання, у буфери, що підтримуються операційною системою.
Якщо ви щось пишете, і це закінчується в буфері (тільки), і живлення відключається на вашій машині, дані не знаходяться на диску, коли машина вимикається.
Отже, для того, щоб допомогти в цьому, ви маєте свої методи flush
та fsync
методи їх відповідних об'єктів.
По-перше, flush
просто випишуть будь-які дані, які зберігаються в програмному буфері до фактичного файлу. Зазвичай це означає, що дані будуть скопійовані з програмного буфера в буфер операційної системи.
Зокрема, це означає, що якщо в іншому процесі цей самий файл відкритий для читання, він зможе отримати доступ до даних, які ви тільки що передали у файл. Однак це не обов'язково означає, що він був "назавжди" збережений на диску.
Для цього вам потрібно викликати os.fsync
метод, який забезпечує всі буфери операційної системи синхронізовані з накопичувачами, для яких вони є, іншими словами, цей метод буде копіювати дані з буферів операційної системи на диск.
Зазвичай вам не потрібно зациклюватися на будь-якому методі, але якщо у вас є сценарій, коли параноїя щодо того, що насправді закінчується на диску, є хорошою справою, вам слід робити обидва дзвінки за інструкцією.
Додаток 2018 року.
Зауважте, що диски з механізмами кешування зараз набагато частіше, ніж у 2013 році, тому зараз є ще більше рівнів кешування та буферів. Я припускаю, що з цими буферами також буде оброблятися синхронізація / змивання дзвінків, але я не знаю насправді.
with file('blah') as fd: #dostuff
конструкцію, я знаю, що це гарантує закриття дескриптора файлів. Це також промиває чи синхронізує?