如何在赛璐珞池阻塞上进行#future调用?

时间:2016-12-03 16:52:31

标签: ruby concurrency celluloid

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

0 个答案:

没有答案