23

テストの準備: sleep 10アクションで

テスト: ブラウザで2つのタブを開いて、アクションにアクセスします

結果: 2番目のリクエストが実行されているとき、最初のリクエストは終了してビューのレンダリングを開始しましたが、ビューはまだ空白です。2番目のリクエストも終了した後、2つのリクエストは同時にビューのレンダリングを終了しました。

結論: Railsは1つのインスタンスにすぎません。1つのリクエストは、前のリクエストが終了した後にのみアクションを入力できます。しかし、応答部分をどのように説明するのですか?マルチリクエストが同時にビューのレンダリングを終了するのはなぜですか?

4

3 に答える 3

24

WEBrick はマルチスレッドですが、Rails 開発者はミューテックスをハードコーディングしているため、一度に 1 つのリクエストしか処理できません。モンキー パッチRails::Serverを適用すると、マルチスレッドの WEBrick を自由に実行できます。

WEBrick は、configconfig.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

削除した問題のあるコード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 では必要ありません。それはすぐに使用できる同時実行です。

于 2014-01-06T00:12:09.347 に答える
5

WEBrickサーバーを使用してい ますか?これは、サーバーがシングル スレッド サーバーであり、一度に 1 つの要求を満たすことができるためです (単一のワーカー スレッドのため)。複数のリクエストの場合、リクエストのアクション部分を実行し、ビューレンダラーを実行する前に、保留中のリクエストがあるかどうかを確認します。10 個のリクエストが並んでいる場合、実際にビューをレンダリングする前に、まずそれらすべてを完了します。これらのリクエストがすべて完了すると、ビューが順番にレンダリングされます。

マルチスレッド環境が必要な場合は、Passenger または Unicorn サーバーに切り替えることができます。

それが理にかなっていることを願っています。

于 2012-12-25T05:08:52.010 に答える
0

環境設定 config/environments/development.rb の下 (または config/application.rb 内)

次の行を追加します。

  #Enable threaded mode
  config.threadsafe!
于 2016-08-03T18:41:04.170 に答える