rails如何同时解决多个请求?

时间:2012-12-25 02:14:11

标签: ruby-on-rails

准备考试: 行动中sleep 10

测试: 在浏览器中打开两个选项卡以访问操作

结果: 当第二个请求正在运行时,第一个请求已完成并开始呈现视图,但视图仍为空白。 第二个请求完成后,两个请求同时完成了渲染视图。

结论: Rails只是一个单一的实例。一个请求只能在先前的请求完成后进入操作。但如何解释响应部分?为什么多请求会同时完成呈现视图?

3 个答案:

答案 0 :(得分:20)

WEBrick是多线程的,但Rails开发人员对互斥锁进行了硬编码,因此它一次只能处理一个请求。你可以修补Rails::Server,你可以自由运行多线程WEBrick。

请注意,WEBrick仅在配置config.cache_classes = trueconfig.eager_load = true时才会多线程,这是RAILS_ENV=production的典型情况。这是因为开发中的类重新加载不是线程安全的。

要在Rails 4.0中完全使用WEBrick多线程,只需将其添加到config/initializers/multithreaded_webrick.rb

# Remove Rack::Lock so WEBrick can be fully multi-threaded.
require 'rails/commands/server'

class Rails::Server
  def middleware
    middlewares = []
    middlewares << [Rails::Rack::Debugger] if options[:debugger]
    middlewares << [::Rack::ContentLength]

    Hash.new middlewares
  end
end

我们摆脱的rails/commands/server.rb中的违规代码是:

# FIXME: add Rack::Lock in the case people are using webrick.
# This is to remain backwards compatible for those who are
# running webrick in production. We should consider removing this
# in development.
if server.name == 'Rack::Handler::WEBrick'
  middlewares << [::Rack::Lock]
end

在Rails 4.2上不需要它。它是开箱即用的。

答案 1 :(得分:4)

您使用的是WEBrick服务器吗?这一定是因为您的服务器是单线程服务器,并且能够一次完成一个请求(因为单个工作线程)。现在,在多个请求的情况下,它运行请求的操作部分,在运行视图渲染器之前,它会检查是否有任何待处理的请求。现在,如果排列了10个请求,它将首先在实际呈现视图之前完成所有请求。完成所有这些请求后,现在将按顺序呈现视图。

如果您需要多线程环境,可以切换到Passenger或Unicorn服务器。

希望这是有道理的。

答案 2 :(得分:0)

在你的env setup config / environments / development.rb下(或在config / application.rb中)

添加以下行:

  #Enable threaded mode
  config.threadsafe!