准备考试:
行动中sleep 10
测试: 在浏览器中打开两个选项卡以访问操作
结果: 当第二个请求正在运行时,第一个请求已完成并开始呈现视图,但视图仍为空白。 第二个请求完成后,两个请求同时完成了渲染视图。
结论: Rails只是一个单一的实例。一个请求只能在先前的请求完成后进入操作。但如何解释响应部分?为什么多请求会同时完成呈现视图?
答案 0 :(得分:20)
WEBrick是多线程的,但Rails开发人员对互斥锁进行了硬编码,因此它一次只能处理一个请求。你可以修补Rails::Server
,你可以自由运行多线程WEBrick。
请注意,WEBrick仅在配置config.cache_classes = true
和config.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)
添加以下行:
#Enable threaded mode
config.threadsafe!