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

Kea*_*ang 22 ruby-on-rails

准备测试: sleep 10在行动中

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

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

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

Now*_*ker 21

WEBrick是多线程的,但Rails开发人员对互斥锁进行了硬编码,因此它一次只能处理一个请求.您可以使用Monkey-patch,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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 或者只需在application.rb中添加`config.middleware.delete'Rack :: Lock'` (2认同)

atm*_*ish 5

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

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

希望有道理。