Normalmente hay dos niveles de almacenamiento intermedio involucrados:
- Tampones internos
- Tampones del sistema operativo
Los búferes internos son búferes creados por el tiempo de ejecución / biblioteca / lenguaje contra el que está programando y están destinados a acelerar las cosas al evitar las llamadas al sistema para cada escritura. En cambio, cuando escribe en un objeto de archivo, escribe en su búfer, y cada vez que el búfer se llena, los datos se escriben en el archivo real mediante llamadas al sistema.
Sin embargo, debido a los búferes del sistema operativo, esto podría no significar que los datos se escriben en el disco . Puede significar que los datos se copian de las memorias intermedias mantenidas por su tiempo de ejecución en las memorias intermedias mantenidas por el sistema operativo.
Si escribe algo y termina en el búfer (solo), y se corta la alimentación de su máquina, esos datos no están en el disco cuando la máquina se apaga.
Entonces, para ayudar con eso, tiene los métodos flush
y fsync
, en sus respectivos objetos.
El primero, flush
simplemente escribirá cualquier dato que permanezca en un búfer de programa en el archivo real. Normalmente, esto significa que los datos se copiarán del búfer del programa al búfer del sistema operativo.
Específicamente, lo que esto significa es que si otro proceso tiene ese mismo archivo abierto para lectura, podrá acceder a los datos que acaba de vaciar al archivo. Sin embargo, no significa necesariamente que se haya almacenado "permanentemente" en el disco.
Para hacer eso, debe llamar al os.fsync
método que garantiza que todos los búferes del sistema operativo estén sincronizados con los dispositivos de almacenamiento para los que están destinados, en otras palabras, ese método copiará los datos de los búferes del sistema operativo al disco.
Por lo general, no necesita molestarse con ninguno de los métodos, pero si se encuentra en un escenario donde la paranoia sobre lo que realmente termina en el disco es algo bueno, debe hacer ambas llamadas según las instrucciones.
Anexo en 2018.
Tenga en cuenta que los discos con mecanismos de caché ahora son mucho más comunes que en 2013, por lo que ahora hay aún más niveles de almacenamiento en caché y búferes involucrados. Yo asumo estos tampones estarán a cargo de las llamadas de sincronización / ras así, pero no se sabe muy bien.
with file('blah') as fd: #dostuff
construcción, sé que garantiza el cierre del descriptor de archivo. ¿También se descarga o se sincroniza?