4

昨日、Ruby のスレッド化について少し読んで (この記事のように)、一般的に理解したのは、(JRuby のようないくつかの実装を除いて) いわゆるグローバル インタープリター ロックがあり、そのために実行できないということでした。一度に複数の CPU で ruby​​ コードを実行できます。私は少しテストを行いました (私は AMD Turion II デュアルコア モバイル M500 プロセッサを持っていて、ubuntu 11.04、+rvm を実行しています)、このコードでこれが動作していることを確認しました:

threads = []
CPU = 2

CPU.times do
  threads << Thread.new {
    x=0
    time=Time.new
    while 1 do
      if Time.new - time >= 30 then
        break
      else
        x=1.00/24000000000.001
      end
    end
  }
  end
threads.each { |t| t.join }
puts "done"

そして、システムモニターのスクリーンショットを撮りました。

REE と 1.9.2 は一度に 1 つのコアを使用しているようですが、1.9.3 は両方を使用しているようです。

これは本当に可能ですか (より多くのコアを使用しても?)、それとも何かが足りないだけで、テストが間違っていますか?

4

1 に答える 1

3

いわゆる Global Interpreter Lock があり、そのため一度に複数の CPU で ruby​​ コードを実行することはできません。

それは部分的にしか真実ではありません。拡張機能のコード (C で記述) は、多くの場合、並列実行をサポートしていません (スレッドセーフではありません)。そのため、拡張機能の呼び出しには Ruby インタープリターが GIL を使用します。しかし、あなたのコードは拡張機能を呼び出していません (Time.new がロックを必要とするだけかもしれませんが、わかりません)。そのため、多くの場合 (およびコード例) の ruby​​ は複数の CPU を利用できます

于 2013-01-31T18:40:53.457 に答える