WEBrickはマルチスレッドですが、Rails開発者はミューテックスをハードコーディングしているため、一度に1つの要求しか処理できません。 monkey-patch Rails::Server
を実行すると、マルチスレッドWEBrickを自由に実行できます。
コンフィグconfig.cache_classes = true
とconfig.eager_load = true
の場合、WEBrickはマルチスレッド化されますが、これは通常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
それは必要ないですon Rails 4.2。同時並行して使用できます。あなたのenvセットアップの設定/環境/ development.rb(または設定/ application.rbで)下
おかげで、あなたは私はあまり混乱して作ります。私は同時に多くのリクエストをテストしますが、10個以下のリクエストが並んだら、webrickはビューをレンダリングし、他のリクエストを解決します。 –
私はwebrickがシングルスレッドサーバではないと思うので、 'config.threadsafe!'を設定することができます。 production.rbでは、複数のリクエストを同時に解決します。 –
'config.threadsafe!'は自動的にWEBrickをマルチスレッドにしません。詳細は私の答えを見てください。 – Nowaker