【问题标题】:Does Rails have *zero* concurrency by default?Rails 默认有 *zero* 并发吗?
【发布时间】:2012-04-02 15:44:40
【问题描述】:

我正在为 Rails 开发一些中间件,使用的是一个相当新的版本:

pfernand-2-mn:~ pfernand$ rails -v
Rails 3.1.2

这是rake middleware的输出:

use ActionDispatch::Static
** use Rack::Lock **
use ActiveSupport::Cache::Strategy::LocalCache
use Rack::Runtime
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::RemoteIp
use Rack::Sendfile
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::MethodOverride
use ActionDispatch::Head
use ActionDispatch::BestStandardsSupport
run MyApp::Application.routes

问题在于第二个组件Rack::Lockas far as I know,一个互斥体,包裹了整个frigging rails 堆栈(!)

这是否意味着无论您使用什么平台,rails 中都没有并发? (我正在使用 JRuby)。

我知道我可以通过以下方式删除锁:

config.middleware.delete(Rack::Lock)

但遗憾的是,这破坏了一切。这是否意味着我的应用不是线程安全的?

【问题讨论】:

  • 简短的历史:rails 2 不是,每个人都声称不可能,merb 证明不是这样,被合并到 rails 3,所以 3 应该是。
  • 那里就是 rails3,它在整个堆栈周围都有一个互斥锁。告诉我这如何被认为是多线程的
  • 它是如何破坏一切的?

标签: ruby-on-rails multithreading concurrency mutex rack


【解决方案1】:

您应该在 config/environments/production.rb 中看到以下条目

  # Enable threaded mode
  # config.threadsafe!

在 JRuby 或其他线程友好的环境中取消注释以在线程安全模式下部署。

【讨论】:

  • 这实际上从中间件堆栈中删除了Rack::Lock。是否有任何文档显示该行的作用? (除了移除锁,这本身是不够的)
  • 它记录在 Rails 指南 guides.rubyonrails.org/configuring.html#configuring-middleware 中,我上次查看时。但是,也许没有您感兴趣的那么详细。不幸的是,这对我来说只是一个理论上的选择,所以我从来没有跟进过。
猜你喜欢
  • 2013-05-23
  • 1970-01-01
  • 2011-02-03
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
相关资源
最近更新 更多