【问题标题】:Using EventMachine with Thin将 EventMachine 与 Thin 一起使用
【发布时间】:2012-02-19 20:01:02
【问题描述】:

我最近在升级到 rails 3 时从 mongrel 切换到 Thin。在切换之前,我们一直在使用 EventMachine 没有任何问题。切换到瘦后,每当调用 EventMachine 时,服务器都会轰炸并说我们返回的变量是 nil。

据我了解,thin 使用 EventMachine,这可能会导致与 Mongrel 使用的实现发生冲突。我使用 EventMachine 的次数不多,但似乎我需要在另一个实例中运行 EventMachine 以将其与 Thin 使用的 EventMachine 分开。我在正确的轨道上吗?我将如何在与 Thin 的 EventMachine 分开的自己的进程中立即运行它?

这是我们目前已经实现的 EventMachine 的 sn-p

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

【问题讨论】:

    标签: ruby-on-rails mongrel eventmachine thin


    【解决方案1】:

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

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

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

    【讨论】:

    • 你说得对,Thin 已经提供了一个 EM 反应器。 EM.stop 发出停止信号是有道理的!我决定彻底取消这个 EM 实现,因为它看起来不太对劲。我将看看如何使用 Sinatra 和异步插件。谢谢丹
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多