为什么我的Ruby线程演示不使用两个内核?

时间:2010-08-06 19:28:34

标签: windows ruby multithreading

希望这个截图能够解释我的问题:

a = Thread.new { loop {} }
b = Thread.new { loop {} }
a.join

Ruby threads demo CPU usage http://img7.imageshack.us/img7/9858/rubycores.png

那么为什么我的两个内核都没有达到最大化?无论我使用多少线程,每次都是一样的;总CPU使用率似乎永远不会超过52%。

>ruby -v
ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32]

4 个答案:

答案 0 :(得分:4)

看起来你正在使用MRI,它无法并行运行线程。目前,唯一能够并行运行线程的生产就绪的Ruby实现是JRuby和IronRuby。

请记住,如果您希望线程实际并行运行,那么堆栈中的每个层都必须能够执行此操作。以JRuby为例:JRuby可以并行运行Ruby线程。但是,它通过将线程映射到JVM线程来实现线程,因此如果JVM无法并行运行线程(并且有些情况就是这种情况),那么 JRuby 可以运行的事实并行的 Ruby 线程对你有所帮助。反过来,许多JVM将JVM线程映射到OS线程。再说一遍:如果操作系统无法并行运行线程,那么JVM就无法做到。最后但并非最不重要:如果只有一个处理器,那么整个练习无论如何都是毫无意义的。

答案 1 :(得分:2)

我认为这个答案很棒。

Does ruby have real multithreading?

由于您使用的是Ruby 1.8.6,因此MRI实施。此引号形成上面的URL解释了为什么只使用了一个核心。

  

MRI在其解释器中将Ruby Threads实现为Green Threads。不幸的是,它不允许并行调度这些线程,它们一次只能运行一个线程。

请注意,MacRuby(YARV的某种端口)最近删除了GIL。因此,您的演示代码将使用MacRuby 0.5或更高版本的两个内核。目前,它是唯一可以并行运行的Ruby实现,不依赖于JVM或CLR。

答案 2 :(得分:1)

要记住的主要事情是Ruby(语言)和Ruby(实现)之间存在差异。你没有说清楚你的意思,但是当你遇到问题时,我认为你的意思是Ruby(实现)。

看一些以前的答案:

Ruby 1.9.1:Native threads in Ruby 1.9.1, whats in it for me?

  

1.9中的ruby线程是本机的,但是它们已经“减速”以允许一次只运行一个线程。这是因为如果线程真正并行运行,它会混淆现有代码。

Does ruby have real multithreading?

这为各种Ruby VM上的Ruby Threading提供了很棒的解释。

答案 3 :(得分:0)

您使用的是什么版本的红宝石,以及哪个翻译? (JRuby,“常规红宝石”等?)

并非所有ruby解释器都可以利用多核/处理器。