Biasanya ada dua tingkat buffering yang terlibat:
- Buffer internal
- Buffer sistem operasi
Buffer internal adalah buffer yang dibuat oleh runtime / library / bahasa tempat Anda memprogram dan dimaksudkan untuk mempercepat dengan menghindari panggilan sistem untuk setiap penulisan. Sebaliknya, saat Anda menulis ke objek file, Anda menulis ke buffernya, dan setiap kali buffer terisi, data ditulis ke file sebenarnya menggunakan panggilan sistem.
Namun, karena buffer sistem operasi, ini mungkin tidak berarti bahwa data ditulis ke disk . Ini mungkin berarti bahwa data disalin dari buffer yang dikelola oleh runtime Anda ke buffer yang dikelola oleh sistem operasi.
Jika Anda menulis sesuatu, dan berakhir di buffer (hanya), dan daya diputus ke mesin Anda, data itu tidak ada di disk saat mesin dimatikan.
Jadi, untuk membantu itu Anda memiliki flush
dan fsync
metode, pada objek masing-masing.
Yang pertama,, flush
hanya akan menulis data apa pun yang tertinggal dalam buffer program ke file sebenarnya. Biasanya ini berarti bahwa data akan disalin dari buffer program ke buffer sistem operasi.
Secara khusus, ini berarti bahwa jika proses lain memiliki file yang sama terbuka untuk dibaca, itu akan dapat mengakses data yang baru saja Anda masukkan ke file. Namun, itu tidak berarti telah disimpan "secara permanen" di disk.
Untuk melakukan itu, Anda perlu memanggil os.fsync
metode yang memastikan semua buffer sistem operasi disinkronkan dengan perangkat penyimpanan tempatnya, dengan kata lain, metode tersebut akan menyalin data dari buffer sistem operasi ke disk.
Biasanya Anda tidak perlu repot dengan metode mana pun, tetapi jika Anda berada dalam skenario di mana paranoia tentang apa yang sebenarnya berakhir di disk adalah hal yang baik, Anda harus membuat kedua panggilan seperti yang diinstruksikan.
Adendum tahun 2018.
Perhatikan bahwa disk dengan mekanisme cache sekarang jauh lebih umum daripada sebelumnya di tahun 2013, jadi sekarang ada lebih banyak level cache dan buffer yang terlibat. Saya berasumsi buffer ini akan ditangani oleh panggilan sync / flush juga, tapi saya tidak begitu tahu.
with file('blah') as fd: #dostuff
konstruksi, saya tahu itu menjamin penutupan deskriptor file. Apakah itu juga flush atau sync?