2011-11-23 67 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

相關問題