IO を非同期で実行して、プロセス内のキューからジョブを処理する必要があります。それはとても簡単です。問題は、これらのジョブが追加のアイテムをキューに追加できることです。
私はこの問題をあまりにも長くいじっていたので、頭がぼんやりしていると思います — それほど難しくないはずです. 私は二者択一のシナリオを考え続けます:
- キューは非同期でジョブを実行でき、後で結果を結合できます。
- キューは、最後のジョブが終了してキューが空になるまで、ジョブを同期的に実行できます。
私は、EventMachine と Goliath (どちらも を使用できますEM::HttpRequest
) から Celluloid (ただし、実際にそれを使って何かを構築することはありませんでした) まで、あらゆるものをいじり、Fiber を使用して Enumerator を作成しました。私の脳は揚げられていますが。
私が望むのは、単純に、これを行うことができることです:
items = [1,2,3]
items.each do |item|
if item.has_particular_condition?
items << item.process_one_way
elsif item.other_condition?
items << item.process_another_way
# ...
end
end
#=> [1,2,3,4,5,6]
...ここで、4、5、および 6 はすべてセット内の元のアイテムを処理した結果であり、7、8、および 9 は 4、5、および 6 を処理した結果です。無期限に処理することを心配する必要はありません処理中のデータは数回の反復後に終了するためです。
低レベルの実装コード例だけでなく、高レベルのガイダンス、コメント、他のライブラリへのリンクなども大歓迎です。