我正在尝试创建工作人员池,这些工作人员将执行一些 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
从池中返回准备使用的工作人员的操作)?