Yestereday我读了一些关于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.9.3似乎同时使用这两个核心。
这真的有可能吗(即使有更多的内核?),还是我只是错过了什么,测试出错了
有一个所谓的全局解释器锁,正因为如此,一个人不能同时在多个CPU上运行ruby代码
这只是部分事实。扩展代码(用C编写)通常不支持并行执行(不支持线程安全)。因此,对于扩展调用,ruby解释器使用GIL。但您的代码不调用任何扩展(可能只有Time.new需要锁定,我不确定)。因此,ruby在许多情况下(以及您的代码示例)可以使用多个CPU。