Je regardais les capacités de traitement parallèle/asynchrone de ruby et lisais de nombreux articles et articles de blog. Je regardais à travers eventmachine, fibres, Revactor, Reia, etc, etc. Malheureusement, je n'ai pas pu trouver une solution simple, efficace (et non-IO-blocage) pour cette utilisation très simple cas:Ruby concurrent/traitement asynchrone (avec un cas d'utilisation 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
est-ce que vous pouvez voir, mon petit script effectue trois opérations lues (R), processus (P) & écrire (W). Supposons - pour simplifier - que chaque opération prend exactement 1 unité de temps (par exemple 10ms), le code actuel serait donc quelque chose comme ça (5 lignes):
Time: 123456789(15 units in total)
Operations: RPWRPWRPWRPWRPW
Mais, je voudrais qu'il fasse quelque chose comme ceci:
Time: 1234567 (7 units in total)
Operations: RRRRR
PPPPP
WWWWW
Évidemment, je peux exécuter trois procédés (lecteur, le processeur & écrivain) et transmettre lignes de lecture de lecteur dans la file d'attente de processeur et ensuite passer les lignes traitées dans la file d'attente d'écriture (tous coordonnés par exemple RabbitMQ) . Mais, le cas d'utilisation est si simple, il ne se sent pas juste.
Des indices sur la façon dont cela pourrait être fait (sans passer de Ruby à Erlang, à Closure ou à Scala)?
Les écritures doivent-elles être appelées dans le même ordre qu'elles ont été lues? –
Non, c'est tout le point qu'ils peuvent être complètement asynchrone. – Dim