如何将我的插件的执行与Celluloid并行化?

时间:2014-02-06 09:22:08

标签: ruby multithreading concurrency celluloid

我的问题应该有助于我走上正确的道路。

我正在使用并发框架celluloid开发一个ruby应用程序。这是它的样子:

activity

我有一些插件。我想同时运行它们并等到最后一个完成。我有一个名为PluginFrame的抽象类,它由所有插件继承,并且还提供run方法。

  1. 我的想法是制作SupervisionGroup,但这是正确的想法吗?
  2. 如何运行SupervisionGroup并等待所有小组成员完成?
  3. 建立一个单独的PluginPool类来管理插件池是个好主意吗?
  4. 限制pool大小对我来说也很有趣,所以只有两三个插件同时运行。我怎样才能实现这个目标?

1 个答案:

答案 0 :(得分:4)

如果您的插件可能崩溃并且您希望赛璐珞重新启动它们,您只需要一个主管。

您想要做的事情可能就像使用池和期货一样简单。

要为插件创建共享池,您需要一个新的actor。

class PluginRunner
  include Celluloid

  def run(plugin)
    plugin.run
  end
end

plugin_runner = PluginRunner.pool(size: 4)

plugins = [LastFmPlugin, TwitterPlugin]
results = plugins.map {|p| plugin_runner.future.run(p) }.map(&:value)
persist_results(results)