我最近在升级到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/