ruby の並列/非同期処理機能を調べていて、多くの記事やブログ投稿を読みました。EventMachine、Fibers、Revactor、Reia などを調べました。残念ながら、この非常に単純なユース ケースに対する単純で効果的な (そして非 IO ブロッキング) ソリューションを見つけることができませんでした。
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
ご覧のとおり、私の小さなスクリプトは、読み取り( R )、プロセス( P )、および書き込み( W ) の 3 つの操作を実行しています。簡単にするために、各操作に正確に 1 単位の時間 (たとえば 10 ミリ秒) かかるとすると、現在のコードは次のようになります (5 行)。
Time: 123456789012345 (15 units in total)
Operations: RPWRPWRPWRPWRPW
しかし、私はそれを次のようにしたいと思います:
Time: 1234567 (7 units in total)
Operations: RRRRR
PPPPP
WWWWW
明らかに、3 つのプロセス (リーダー、プロセッサー、ライター) を実行し、読み取り行をリーダーからプロセッサ キューに渡し、処理された行をライター キューに渡すことができます (すべて、RabbitMQ などを介して調整されます)。しかし、ユースケースは非常に単純で、適切ではありません。
(Ruby から Erlang、Closure、または Scala に切り替えることなく)これを行う方法についての手がかりはありますか?