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