一个进程中有多个Ruby EventMachines:可能吗?

时间:2011-11-23 19:03:14

标签: ruby eventmachine

我有一种情况,我想在Ruby中运行多个EventMachines - 有没有人有这方面的经验? (如果没有,我可以自己写一个测试用例。请继续关注。)

让我们明确一点:我想自己实例化两个线程,并在两个线程中调用EventMachine.run,所以我真的有两个反应器循环。

原因是我正在使用AMQP gem编写异步消息总线,它使用EventMachine。这没关系,但我想把它作为一个单独的模块化组件,可以在两个应用程序中使用:

  • 一个有自己的阻塞gui循环(无法通过从EventMachine调用tick来模拟它 - 它真的阻塞,它在C库中执行,所以我不能破解它)。这个很简单 - 只需在自己的线程中启动EM,并以线程安全的方式在循环之间共享传入的消息;
  • 本身在反应堆循环中运行的另一个应用程序,我可以与AMQP代码共享(这对于线程安全问题很好 - 尽管我不得不解决它们应用程序)。这是让我思考的问题......我可以通过运行两个独立的EventMachines与上述应用程序共享消息总线代码吗?

有人有想法吗?

2 个答案:

答案 0 :(得分:7)

好的,深入了解EM的文档,我看到EventMachine.run的正文从这开始:

240:     if reactor_running?
241:       (b = blk || block) and b.call # next_tick(b)
242:     else
         ... start the reactor ...

这太棒了。看起来,如果你在多个线程中执行EventMachine.run,它将调度第二台机器的定义 - 传递给“run”的块 - 在已经运行的reactor上。

我喜欢这个图书馆。

答案 1 :(得分:3)

你自己回答了,但我想加上我的2美分而没有可怕的评论样式。

# this will start the eventmachine reactor
EM::run do

  # do something

  # this will do nothing and the block passed to it will
  # just be executed directly
  EM::run do
    # do something else
  end

end