2012-01-20 36 views
14

He echado un vistazo a los documentos pero parece que no puedo encontrar la parte relevante. ¿Alguien puede decirme para qué sirve la llamada al sync en el siguiente código?¿Qué hace "file.sync = true"?

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

Respuesta

18

Establece el modo de sincronización del archivo.

Esto afecta las operaciones futuras y hace que la salida se escriba sin búfer de bloque.

Si f.tty? es verdadero, es decir, si el archivo está conectado a un dispositivo similar a una consola, la salida no se almacenará en búfer. Pero cuando la salida va a una tubería o archivo, f.tty? será falso y la biblioteca de E/S cambiará a buffer buffering, es decir, acumulando salida en un buffer y escribiéndola solo si el archivo está cerrado, el programa sale, o el buffer se llena Esto es más rápido y el resultado final es el mismo.

Configuración f.sync = true derrota este modificador. Esto puede ser útil si la salida de la tubería está conectada a algo que en realidad es una consola o de alguna manera interactiva o si el contenido del archivo está siendo monitoreado activamente.

+1

+1, es importante mantener el almacenamiento en memoria intermedia tanto como sea posible. No hay nada como descubrir cuán útil es el buffering de la manera más difícil. –

+1

La respuesta más informativa. Gracias. –

4

Básicamente, escribe cualquier dato almacenado en memoria en el disco de inmediato.

+0

Sonidos correctos. Me pregunto por qué no está en los documentos. http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html –

+1

"Me pregunto por qué no está en los documentos". Porque es parte de IO? Prueba 'ri IO.sync'. –

+3

Esta respuesta es algo engañosa. La operación que escribe los datos inmediatamente es 'fh.fsync'. El método '# sync' establece el modo de sincronización y afecta las operaciones futuras. Ahora bien, si se refería a operaciones de "causas * futuras * para escribir datos de inmediato", entonces, claro. – DigitalRoss

2

Tempfile hereda de IO. De IO.sync documentos:

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