2

MRIとJRubyの観点から、マルチスレッドに頭を悩ませようとしています。私は簡単なシナトラアプリをやりました:

require 'sinatra'

get '/long' do
  sleep(10)
  "Long operation finished"
end

get '/other' do
  "Time now is #{Time.now}"
end

これをruby1.9.3で実行すると、呼び出されruby app.rbたとき/longに他のリクエストを完了できないと予想していました。しかし、完了を待っている/otherときでも、別のブラウザで呼び出すことができることがわかりました。/long

そして、私はここで立ち往生しています。これはJRuby(たとえば、トリニダードでアプリを実行する場合)には当てはまるはずですが、MRIには当てはまらないと思いました。そのように機能させるには、いくつかのインスタンスを生成する必要があると思いました。

誰かが私が間違っているところを説明してもらえますか?長時間実行されている1つのブロックであっても、他の要求から応答を取得できるのはなぜですか?

4

1 に答える 1

3

MRIには、2つのスレッドが一緒に実行されるのを防ぐグローバルインタープリターロックがあります。あなたの例では、長いスレッドがスリープしている(何もしていない)ので、MRIはそれを一時停止して他のスレッドを実行できます。両方のスレッドがCPU時間の100%を費やしている場合、一方のスレッドがもう一方のスレッドを待機することが予想されます。JRubyを使用している場合は、各スレッドが各コアから100%のCPU時間を消費するため(マルチコアプロセッサを使用している場合)、スレッドの速度が低下することはありません。

次の記事はあなたの質問に深く答えるはずです:http://ablogaboutcode.com/2012/02/06/the-ruby-global-interpreter-lock/

于 2012-12-03T22:39:56.477 に答える