准备测试:
sleep 10在行动中
测试: 在浏览器中打开两个选项卡以访问操作
结果: 第二个请求运行时,第一个请求完成并开始呈现视图,但视图仍为空白.第二个请求完成后,两个请求同时完成了渲染视图.
结论: Rails只是一个单一的实例.一个请求只能在先前的请求完成后进入操作.但如何解释响应部分?为什么多请求会同时完成呈现视图?
Now*_*ker 21
WEBrick是多线程的,但Rails开发人员对互斥锁进行了硬编码,因此它一次只能处理一个请求.您可以使用Monkey-patch,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上不需要它.它是开箱即用的.
您正在使用   WEBrick服务器吗?这必须是因为您的服务器是单线程服务器,并且能够一次满足一个请求(因为有单个工作线程)。现在,在有多个请求的情况下,它将运行请求的操作部分,并且在运行视图渲染器之前,它将检查是否有任何待处理的请求。现在,如果排队了10个请求,它将首先完成所有请求,然后再实际呈现视图。当所有这些请求完成时,现在将按顺序呈现视图。
如果需要多线程环境,可以切换到Passenger或Unicorn服务器。
希望有道理。
| 归档时间: | 
 | 
| 查看次数: | 9790 次 | 
| 最近记录: |