1

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使用できるワーカーを返すプールからのようなことを実行します)。

4

0 に答える 0