4

昨天看了一点关于 ruby​​ 中的线程(比如这篇文章),我大致的理解是,(除了 JRuby 之类的少数实现),有所谓的全局解释器锁,因此无法运行一次在多个 CPU 上运行 ruby​​ 代码。我做了一个小测试(我有 AMD Turion II Dual-Core Mobile 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.9.3 似乎同时使用了两者。

这真的有可能(即使有更多的核心?),还是我只是遗漏了一些东西,而测试是错误的?

4

1 回答 1

3

有所谓的全局解释器锁,正因为如此,一个人不能同时在多个 CPU 上运行 ruby​​ 代码

这只是部分正确。扩展代码(用 C 编写)通常不支持并行执行(不是线程安全的)。因此对于扩展调用,ruby 解释器使用 GIL。但是你的代码没有调用任何扩展(可能只是 Time.new 需要锁,我不确定)。因此 ruby​​ 在许多情况下(以及您的代码示例)可以利用多个 CPU

于 2013-01-31T18:40:53.457 回答