【发布时间】: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::Lock 是as 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