HTTP 通信を実行し、結果を使用して値を計算するワーカーのプールを作成しようとしています。
私の最初のアプローチは次のようになります。
class Worker
include Celluloid
...
end
pool = Worker.pool(size: 5)
collection.map do
arguments = compute_arguments
pool.future.external_call(arguments)
end.inject(0) { |acc, el| acc + el.value }
ほぼ期待どおりに動作します — 5 つの並行プロセスがexternal_call
同時に実行されているようです。
問題は、コードが「合理化」されておらず、事前にすべてを事前計算することarguments
です (これらの計算は よりもはるかに高速ですexternal_call
)。プールはすぐに作業を開始する未来を提供できないため、コードを最初のブロックで待機させたいと思います。
future
はプールがワーカーを解放するのを待っていません (またそうでもありませんasync
)。これらの呼び出しをプール内の空きワーカーを待機させるにはどうすればよいですか (つまり、get
使用できるワーカーを返すプールからのようなことを実行します)。