2010-05-01 17 views
12

Para no bloquear el reactor, me gustaría leer los archivos de forma asincrónica, pero no he encontrado una forma obvia de hacerlo con EventMachine. He intentado un par de enfoques diferentes, pero ninguno de ellos se siente bien:¿Cuál es la mejor manera de leer archivos en una aplicación basada en EventMachine?

  • acaba de leer el archivo, que va a bloquear el reactor, pero qué demonios, no es que lenta (a menos que sea un gran archivo, y definitivamente lo es).
  • Abra el archivo para leer y lea un trozo en cada tic (pero ¿cuánto leer? Demasiado y bloqueará el reactor, muy poco y la lectura será más lenta de lo necesario).
  • EM.popen('cat some/file', FileReader) se siente muy raro, pero funciona mejor que las alternativas anteriores. En combinación con el LineAndTextProtocol, lee líneas con bastante rapidez.
  • EM.attach, pero no he encontrado ningún ejemplo de cómo usarlo, y lo único que he encontrado en la lista de correo es que está desfasada y en su ...
  • EM.watch, que no he encontrado ejemplos de cómo usar para leer archivos.

¿Cómo se leen los archivos dentro de un lazo del reactor EventMachine?

Respuesta

6

EM.attach/watch no se puede utilizar en archivos, ya que select/epoll en un descriptor de archivo basado en disco siempre será legible.

En última instancia, depende de lo que está tratando de hacer. Si es un archivo pequeño, simplemente File.read it. Si es más grande, puede leer pequeños trozos con el tiempo. Por ejemplo, EM :: FileStreamer hace esto para enviar archivos de gran tamaño a través de la red.

Otro caso de uso común es alinear un archivo y leer contenido nuevo cuando cambia. Esto se puede lograr usando EM.watch_file: http://github.com/jordansissel/eventmachine-tail

+0

Básicamente, quiero leer algunos archivos moderadamente grandes (hasta 10 Mb) en paralelo y extraer una parte de cada línea. – Theo

+0

Si la operación que necesita realizar es por línea, leer una línea del archivo en cada tick parece tener más sentido. Tendría la ventaja de todos los métodos de E/I basados ​​en líneas de Ruby, sus bloques de eventos reflejarían más fielmente su lógica de negocios, y hacer menos en cada bloque simplemente significa que los tics ocurrirían más rápido. – SFEley

+0

Leer una línea en cada tic es demasiado lento porque paso tiempo dentro del reactor esperando IO, y eso es lo que quiero evitar, quiero hacer otras cosas (como procesar la línea) mientras espero IO. – Theo

Cuestiones relacionadas