python io output-buffering fsync

¿Qué está haciendo exactamente el archivo python''s file.flush()?



io output-buffering (3)

Normalmente hay dos niveles de almacenamiento intermedio involucrados:

  1. Buffers internos
  2. Búfers del sistema operativo

Los almacenamientos intermedios internos son almacenamientos intermedios creados por el tiempo de ejecución / biblioteca / idioma 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 se llena el búfer, 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 que solo signifique que los datos se copian de los búferes mantenidos por su tiempo de ejecución en los búferes mantenidos por el sistema operativo.

Si escribe algo, y termina en el búfer (solamente), y la energía se corta en su máquina, esos datos no están en el disco cuando la máquina se apaga.

Entonces, para ayudar con eso tienes 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. Por lo general, esto significa que los datos se copiarán del búfer de programa al búfer del sistema operativo.

Específicamente, lo que esto significa es que si otro proceso tiene el mismo archivo abierto para lectura, podrá acceder a los datos que acabas de tirar al archivo. Sin embargo, no necesariamente significa que ha sido "permanentemente" almacenado en el disco.

Para hacerlo, debe llamar al método os.fsync que garantiza que todos los búferes del sistema operativo estén sincronizados con los dispositivos de almacenamiento para los que están, en otras palabras, que el 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 una situación en la que la paranoia acerca de lo que realmente termina en el disco es algo bueno, debe realizar ambas llamadas según las instrucciones.

Encontré esto en la documentación de Python para objetos de archivo :

flush () no necesariamente escribe los datos del archivo en el disco. Use flush () seguido de os.fsync () para garantizar este comportamiento.

Así que mi pregunta es: ¿qué está haciendo exactamente el flush de Python? Pensé que obliga a escribir datos en el disco, pero ahora veo que no lo hace. ¿Por qué?


Porque el sistema operativo puede no hacerlo. La operación de descarga fuerza los datos del archivo en la caché de archivos en la RAM, y desde allí es el trabajo del sistema operativo el que realmente lo envía al disco.


Vacía el búfer interno, que se supone que hace que el sistema operativo escriba el búfer en el archivo. [1] Python utiliza el almacenamiento en búfer predeterminado del sistema operativo a menos que lo configure de otra manera.

Pero a veces el sistema operativo sigue optando por no cooperar. Especialmente con cosas maravillosas como retrasos de escritura en Windows / NTFS. Básicamente, el búfer interno se vacía, pero el búfer del sistema operativo todavía se está aferrando a él. Entonces debe decirle al sistema operativo que lo escriba en el disco con os.fsync() en esos casos.

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