Stavo esaminando le capacità di elaborazione parallela/asincrona di Ruby e leggevo molti articoli e post di blog. Ho guardato attraverso EventMachine, Fibre, Revactor, Reia, ecc, ecc Purtroppo, non ero in grado di trovare una soluzione semplice, efficace (e non-IO-blocco) per questo molto semplice caso d'uso:Concorrenza di ruby / elaborazione asincrona (con caso d'uso semplice)
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
è che si può vedere, il mio piccolo script sta eseguendo tre operazioni lette (R), processo (P) & scrittura (W). Supponiamo - per semplicità - che ogni operazione richiede esattamente 1 unità di tempo (ad esempio 10 ms), il codice attuale sarebbe quindi fare qualcosa di simile (5 righe):
Time: 123456789(15 units in total)
Operations: RPWRPWRPWRPWRPW
Ma, mi piacerebbe fare qualcosa in questo modo:
Time: 1234567 (7 units in total)
Operations: RRRRR
PPPPP
WWWWW
Ovviamente, ho potuto eseguire tre processi (lettore, processore & scrittore) e trasmettere leggere linee dal lettore nella coda del processore e quindi passare linee trasformate nella coda scrittore (tutti coordinati ad esempio tramite RabbitMQ) . Ma il caso d'uso è così semplice, non sembra giusto.
Eventuali indizi su come ciò potrebbe essere fatto (senza passare da Ruby a Erlang, Closure o Scala)?
Le scritture devono essere chiamate nello stesso ordine in cui sono state lette? –
No, questo è il punto in cui possono essere completamente asincroni. – Dim