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