Estaba investigando las capacidades de procesamiento paralelo/asíncrono de Ruby y leí muchos artículos y publicaciones de blog. Miré a través de EventMachine, Fibras, Revactor, Reia, etc, etc. Por desgracia, yo no era capaz de encontrar una solución sencilla, eficaz (y no-IO-bloqueo) para este caso de uso muy sencillo:Simultaneidad de Ruby/procesamiento asíncrono (con caso de uso simple)
File.open('somelogfile.txt') do |file|
while line = file.gets # (R) Read from IO
line = process_line(line) # (P) Process the line
write_to_db(line) # (W) Write the output to some IO (DB or file)
end
end
es que se puede ver, mi pequeño script está llevando a cabo tres operaciones leen (R ), proceso (P ) & de escritura (W ). Vamos a suponer que - por simplicidad - que cada operación tiene exactamente 1 unidad de tiempo (por ejemplo, 10 ms), por lo tanto, el código actual podría hacer algo como esto (5 líneas):
Time: 123456789(15 units in total)
Operations: RPWRPWRPWRPWRPW
Pero, me gustaría que haga algo como esta:
Time: 1234567 (7 units in total)
Operations: RRRRR
PPPPP
WWWWW
Obviamente, podría correr tres procesos (lector, procesador & escritor) y pasar leer líneas de lector en la cola del procesador y luego pasar líneas procesadas en la cola de escritor (todos coordinados a través de por ejemplo RabbitMQ) . Pero, el caso de uso es tan simple, simplemente no se siente bien.
¿Alguna pista sobre cómo esto podría hacerse (sin cambiar de Ruby a Erlang, Closure o Scala)?
¿Se deben llamar las escrituras en el mismo orden en que se leyeron? –
No, ese es el punto en el que pueden ser completamente asincrónicos. – Dim