gpt4 book ai didi

ruby-on-rails - Rails如何同时解决多个请求?

转载 作者:行者123 更新时间:2023-12-02 18:33:27 24 4
gpt4 key购买 nike

准备测试:在一个 Action 中睡 10 个小时

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

结果:当第二个请求运行时,第一个请求完成并开始渲染 View ,但 View 仍然是空白的。第二个请求也完成后,两个请求同时完成了 View 的渲染。

结论:Rails 只是一个实例。一个请求只能在前一个请求完成后才能进入该操作。但如何解释响应部分呢?为什么多个请求同时完成 View 渲染?

最佳答案

WEBrick 是多线程的,但 Rails 开发人员硬编码了互斥体,因此它一次只能处理一个请求。你可以猴子补丁Rails::Server并且您可以自由运行多线程 WEBrick。

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

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

关于ruby-on-rails - Rails如何同时解决多个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com