ruby-on-rails - 将 EventMachine 与 Thin 结合使用

标签 ruby-on-rails mongrel eventmachine thin

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

据我了解,thin 使用了 EventMachine,这可能会导致与 Mongrel 所使用的实现发生冲突。我没有太多使用EventMachine,但似乎我需要在另一个实例中运行EventMachine,以将其与thin 使用的EventMachine 分开。我走在正确的 rails 上吗?我将如何瞬时使其在与 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

最佳答案

Thin 已经提供并管理 EventMachine react 器,因此您无需单独设置。我认为您不需要将此代码嵌入到 EventMachine.run {} 中初学者的 block 。

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

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

关于ruby-on-rails - 将 EventMachine 与 Thin 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022991/

相关文章:

ruby-on-rails - 使用 strftime 解析日期

ruby-on-rails - RoR 在刷新时重新加载内容是如何工作的?

ruby-on-rails - JRuby on Rails 部署

ruby-on-rails - 带有 Ruby 1.9 的 Mongrel

ruby - 将 PTY 输出与 Eventmachine 同步

ruby - 带有 eventmachine 的 mongoid 和 mongomapper

css - 更正 Bootstrap 4 中导航栏链接的垂直对齐

ruby-on-rails - 自引用 has_many :through with customized :primary key issue

ruby-on-rails - 映射到深度哈希中的值