使用带有Thin的EventMachine

时间:2012-01-26 18:05:49

标签: ruby-on-rails mongrel eventmachine thin

我最近在升级到rails 3时从mongrel切换到了瘦。在切换之前,我们一直在使用EventMachine而没有任何问题。切换到精简版后,每当调用EventMachine时,服务器都会弹出并说我们返回的变量为零。

据我所知,thin使用EventMachine,这可能会导致与Mongrel一起使用的实现发生冲突。我没有使用过EventMachine,但似乎我需要在另一个实例中运行EventMachine以将它与thin使用的EventMachine分开。我是在正确的轨道上吗?我如何能够立即将其与Thin的EventMachine分开运行?

以下是我们目前已实施的EventMachine的片段

def connect
  EventMachine.run {
    args, options = { 
     :query => @options[:query],
      :head  => @options[:headers]
    }, {
      :connect_timeout    => @options[:timeout],
      :inactivity_timeout => @options[:timeout]
    }   

    args[:body] = @options[:data] if allow_body?
    args[:redirects] = @options[:redirects] if @options[:redirects]

    http = EventMachine::HttpRequest.new(@uri, options).send(@options[:method], args)

    http.errback  {
      @response = HttpConnection::Response.new(http, false, @options[:logger])

      EventMachine.stop
    }   

    http.callback {
      @response = HttpConnection::Response.new(http, true, @options[:logger])

      EventMachine.stop
    }   
  }   

  return @response
end

1 个答案:

答案 0 :(得分:3)

Thin已提供并管理EventMachine反应器,因此您无需单独设置一个。我认为您不需要将此代码嵌入EventMachine.run {}块中作为初学者。

您的方法存在一些问题。首先,返回的@response变量将始终为nil,因为EventMachine::HttpRequest异步发生,并且在您点击http.callback {}块之前不会向您提供任何数据。其次,在每个EventMachine::HttpRequest回调中,您正在调用EventMachine.stop。这将导致停止thin网络服务器的效果,这可能是您看到服务器爆炸的原因。

如果您尝试在rails应用程序中运行此类代码,则可能需要找到一种异步处理调用的方法,以便在等待长时间运行的进程发生时应用程序不会挂起。我用过的一个很好的方法是使用Sinatra,它有一个async插件,允许你保持打开长时间运行的请求。然后,您可以使用rails metal将其包含在rails3应用程序中,以便将对async / eventmachine代码的请求路由到sinatra。