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 elLineAndTextProtocol
, 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?
Básicamente, quiero leer algunos archivos moderadamente grandes (hasta 10 Mb) en paralelo y extraer una parte de cada línea. – Theo
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
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