使用Thin加载Rails后,在新线程中运行EventMachine

时间:2013-05-19 16:02:08

标签: ruby-on-rails eventmachine thin

我在瘦服务器和application.rb上运行了Rails 3.2应用程序我想启动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。但是Thin应该处理这个问题吗?
  • 也许我应该以不同的方式启动我的服务器,但是如何呢?

2 个答案:

答案 0 :(得分:3)

经过一些谷歌搜索后,我发现因为我使用Thin,所以我不需要运行另一个EventMachine。

我的after_initialize块现在看起来像这样:

config.after_initialize do
  include SomeModule
end

在SomeModule中,我将代码包装在EM.next_tick块中,或者我得到“eventmachine not initialized:evma_connect_to_server(RuntimeError)”错误。

在使用Thin的Rails应用程序中使用EventMachine比我想象的更容易:)

答案 1 :(得分:0)

您应该阻止自动加载调用EventMachine的ruby代码,否则它将阻止您的主线程。将脚本放到lib / daemons中,然后为EventMachine创建一个启动脚本并将其用作守护进程。即:

#!/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)

您需要在Gemfile中添加'daemons'gem。

然后从rails root运行script/my_daemon start。还有更多命令:

  • script / my_daemon stop#stop the daemon
  • script / my_daemon run#在前台运行,因此您可以看到输出并进行调试
  • script / my_daemon status#显示是否正在运行

您会在/tmp/my_daemons/my_daemon.output

中找到日志

在此处详细了解守护进程:http://daemons.rubyforge.org/Daemons.html