2011-11-23 59 views
5

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

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

原因是我正在使用EventMachine编写AMQP gem的异步消息总线。这很好,但我要特别强调的是可以在两个应用程序中使用一个单独的,模块化的组件:

  • 一个有其自己的阻塞GUI循环(即不能由EventMachine的调用蜱进行模拟 - 它确实块,它在C库中完成,所以我不能破解它)。这很简单 - 只需在自己的线程中启动EM,并以线程安全的方式在循环之间共享传入消息;
  • 和另一个应用程序本身运行在一个反应​​器循环,我可能与AMQP代码共享(这对线程安全问题很好 - 尽管我必须针对上述应用程序解决它们)。这是让我思考的......我可以通过运行两个独立的EventMachines来与上述应用共享消息总线代码吗?

有人有想法吗?

回答

5

OK,挖掘到EM的文档,我看到身体的EventMachine.run始于此:

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

这是真棒。看起来像是,如果在多个线程中执行EventMachine.run,它将安排第二台机器的定义 - 传递给“运行”的模块 - 在已经运行的反应器上。

我爱这个图书馆。

2

你自己回答,但我想增加我的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 
-1

如果多个服务器运行在同一个EM中,可能会导致一些问题。 也许你可以在多个进程中启动em来使用相同的EM

相关问题