2012-01-20 18 views
14

Ho dato un'occhiata ai documenti ma non riesco a trovare la parte pertinente. Qualcuno può dirmi come si chiama sync nel seguente codice?Cosa fa "file.sync = true"?

fh = Tempfile.new('tmp') 
fh.sync = true 

risposta

18

Imposta la modalità di sincronizzazione del file.

Influisce sulle operazioni future e causa la scrittura dell'output senza buffering di blocchi.

Se f.tty? è vero, ovvero se il file è connesso a un dispositivo simile a una console, l'output non viene bloccato in blocco. Ma quando l'output va a una pipe oa un file, f.tty? sarà falso e la libreria I/O passerà al buffer di blocco , ovvero, accumulando l'output in un buffer e scrivendolo solo se il file è chiuso, il programma termina, o il buffer si riempie. Questo è più veloce e il risultato finale è lo stesso.

L'impostazione f.sync = true interrompe questo interruttore. Questo può essere utile se l'output della pipe è connesso a qualcosa che in realtà è una console o in qualche modo interattivo o se il contenuto del file viene monitorato attivamente.

+1

+1, è importante mantenere il buffer il più possibile. Non c'è niente come scoprire quanto utile sia il buffering nel modo più duro. –

+1

La risposta più informativa. Grazie. –

4

Fondamentalmente, scrive immediatamente su disco tutti i dati memorizzati nella memoria.

+0

Suoni corretti. Mi chiedo perché non sia nei documenti. http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html –

+1

"Mi chiedo perché non è nei documenti."? Perché fa parte dell'IO? Prova 'ri IO.sync'. –

+3

Questa risposta è in qualche modo fuorviante. L'operazione che scrive immediatamente i dati è 'fh.fsync'. Il metodo '# sync' imposta la modalità di sincronizzazione e influenza le operazioni future. Ora, se intendessi "cause * future * operazioni per scrivere subito i dati", allora, certo. – DigitalRoss

2

Tempfile eredita da IO. Dai documenti IO.sync:

ios.sync -> true or false 

------------------------------------------------------------------------------ 

Returns the current ``sync mode'' of ios. When sync mode is true, all 
output is immediately flushed to the underlying operating system and is not 
buffered by Ruby internally. See also IO#fsync. 

    f = File.new("testfile") 
    f.sync #=> false