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

准备考试:在一个动作中sleep 10

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

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

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

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

如果需要multithreading环境,可以切换到Passenger或Unicorn服务器。

希望有道理。

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

请注意,只有当config config.cache_classes = trueconfig.eager_load = true时,WEBrick才会是multithreading的,这是RAILS_ENV=production典型特征。 这是因为开发中的类重新加载不是线程安全的。

要在Rails 4.0中完全使用WEBrickmultithreading,只需将其添加到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上不需要它。 它是开箱即用的。

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

添加此行:

  #Enable threaded mode config.threadsafe!