2013-05-19 23 views
0

我有一個Rails 3.2的應用程序瘦服務器上,並在application.rb中運行,我想談談EventMachine的:Rails中後新的線程上運行EventMachine的是用薄裝

# application.rb 

config.after_initialize do 
    if ENV['EM'] 
    EM.run do 
     host = '0.0.0.0' 
     port = 3001 

     # hit Ctrl + C to stop 
     Signal.trap("INT") { EventMachine.stop } 
     Signal.trap("TERM") { EventMachine.stop } 

     EventMachine::start_server host, port, SomeModule 

     puts "EventMachine running on #{host}:#{port}. Ctrl + C to stop." 
    end 
    end 
end 

SomeModule具有取決於Rails代碼正在加載。這就是爲什麼我把它放在after_initialize塊中而不是在初始化器中。現在

當我開始我的服務器(與rails s)我的輸出看起來不錯:

=> Booting Thin 
=> Rails 3.2.13 application starting in development on http://0.0.0.0:3000 
=> Call with -d to detach 
=> Ctrl-C to shutdown server 
EventMachine running on 0.0.0.0:3001. Ctrl + C to stop. 

但是,當我走在我的瀏覽器到localhost我得到了204 No Content響應。

我能想到的幾件事情,導致這一點,但不是一個解決方案:)

  • 也許我開始在同一個線程阻塞Rails應用程序的EventMachine的。但薄應該處理這個權利?
  • 也許我應該以不同的方式啓動我的服務器,但如何呢?

回答

3

經過一些谷歌搜索後,我發現,因爲我使用瘦我不需要運行另一個EventMachine。

我after_initialize塊現在看起來是這樣的:

config.after_initialize do 
    include SomeModule 
end 

而在SomeModule我包我的代碼在EM.next_tick塊或者我會得到一個「EventMachine的未初始化:evma_connect_to_server(RuntimeError)」的錯誤。

在Thin的Rails應用中使用EventMachine比我想象的要容易得多:)

+0

有關[EventMachine github wiki]的更多信息(https://github.com/eventmachine/eventmachine/wiki/FAQ#does-em-work-with-other-ruby-threads-running) – thinkOfaNumber

0

你應該防止自動加載調用EventMachine的ruby代碼,否則會阻塞你的主線程。將腳本放到lib /守護進程中,然後爲您的EventMachine創建一個啓動腳本並將其用作守護進程。 I.e .:

#!/usr/bin/env ruby 
# this is: ./scripts/my_daemon 

require 'daemons' 

options = { 
    multiple: false, 
    backtrace: true, 
    app_name: 'my_daemon', 
    dir_mode: :normal, 
    dir: '/tmp/my_daemon', 
    log_dir: '/tmp/my_daemon', 
    log_output: true, 
    ARGV: ARGV, 
} 

system "mkdir -p /tmp/my_daemons" 
Daemons.run(File.join(File.dirname(__FILE__), '../lib/daemons/my_daemon.rb'), options) 

您需要將'守護進程'gem添加到您的Gemfile中。

然後從rails root運行script/my_daemon start。有多個命令:

  • 腳本/ my_daemon停止#停止了守護
  • 腳本/ my_daemon運行#在前臺運行,所以你可以看到輸出並調試它
  • 腳本/ my_daemon狀態#顯示是否任何正在運行

你會發現在日誌/tmp/my_daemons/my_daemon.output

查找更多關於守護在這裏:http://daemons.rubyforge.org/Daemons.html

+0

在此期間,我找到了一個解決方案。如果我使用Thin,我需要一個守護進程嗎? – Flauwekeul

+0

這取決於你正在解決什麼問題。守護進程gem讓您可以更好地控制後臺進程,從而將EventMachine與主應用程序分離,您可以獨立啓動/停止它。你可以包含配置/環境。rb在守護進程中獲得完整的env你的Rails應用程序。但是,既然你找到了一個更簡單的解決方案,它可能適用於你。 :) – Spajus

+0

這聽起來像是我將來可能需要的東西,我一定會研究它。謝謝! – Flauwekeul

相關問題