Normalmente, existem dois níveis de buffer envolvidos:
- Buffers internos
- Buffers do sistema operacional
Os buffers internos são buffers criados pelo tempo de execução / biblioteca / linguagem contra os quais você está programando e devem acelerar as coisas, evitando chamadas do sistema para cada gravação. Em vez disso, quando você grava em um objeto de arquivo, grava em seu buffer e sempre que o buffer é preenchido, os dados são gravados no arquivo real usando chamadas do sistema.
No entanto, devido aos buffers do sistema operacional, isso pode não significar que os dados sejam gravados no disco . Pode apenas significar que os dados são copiados dos buffers mantidos pelo seu tempo de execução nos buffers mantidos pelo sistema operacional.
Se você escrever algo e ele terminar no buffer (somente), e a energia for cortada em sua máquina, esses dados não estarão no disco quando a máquina for desligada.
Portanto, para ajudar você a ter os métodos flush
e fsync
, em seus respectivos objetos.
O primeiro flush
,, simplesmente escreverá todos os dados que permanecem em um buffer de programa no arquivo real. Normalmente, isso significa que os dados serão copiados do buffer do programa para o buffer do sistema operacional.
Especificamente, o que isso significa é que, se outro processo tiver o mesmo arquivo aberto para leitura, ele poderá acessar os dados que você acabou de liberar para o arquivo. No entanto, isso não significa necessariamente que ele foi "permanentemente" armazenado no disco.
Para fazer isso, é necessário chamar o os.fsync
método que garante que todos os buffers do sistema operacional sejam sincronizados com os dispositivos de armazenamento para os quais eles são, ou seja, esse método copiará os dados dos buffers do sistema operacional para o disco.
Normalmente, você não precisa se preocupar com nenhum dos métodos, mas se estiver em um cenário em que a paranóia sobre o que realmente acaba em disco é uma coisa boa, faça as duas chamadas conforme as instruções.
Adendo em 2018.
Observe que agora os discos com mecanismos de cache são muito mais comuns do que em 2013, então agora há ainda mais níveis de cache e buffers envolvidos. Eu assumir estes buffers serão tratadas pelas chamadas de sincronização / lave bem, mas eu realmente não sei.
with file('blah') as fd: #dostuff
construção, sei que ela garante o fechamento do descritor de arquivo. Também libera ou sincroniza?