7

我试图了解 MRI Ruby 1.8 和 JRuby 之间不同线程模型的实际影响。

作为开发人员,这种差异对我意味着什么?

此外,MRI Ruby 1.8 中是否有任何实际的代码示例,由于不同的线程模型,它们在 JRuby 上的性能特征会更差?

4

3 回答 3

11

状态

  • ruby 1.8 有绿色线程,这些线程可以快速创建/删除(作为对象),但不能真正并行执行,甚至不是由操作系统调度而是由虚拟机调度
  • ruby 1.9 有真正的线程,由于操作系统调用,这些线程的创建/删除(作为对象)很慢,但是由于 GIL(全局解释器锁)一次只允许一个线程执行,这些都不是真正的并行
  • JRuby 也有由操作系统调度的真实线程,并且是真正并发的

结论

从线程的角度来看,在 2 核 CPU 上运行的线程程序将在 JRuby 上运行得比其他实现更快

注意!

许多现有的 ruby​​ 库都不是线程安全的,因此 JRuby 的优势在很多时候毫无用处。
另请注意,如果要使用线程,许多 ruby​​ 编程技术(例如类 vars)将需要额外的编程工作以确保线程安全(互斥锁、监视器等)。

于 2010-03-03T15:29:14.857 回答
6

JRuby 的线程是本机系统线程,因此它们为您提供了线程编程的所有好处(包括使用多个处理器内核,如果适用)。但是,Ruby 有一个全局解释器锁 (GIL),它可以防止多个线程同时运行。因此,唯一真正的性能差异是您的 MRI/YARV Ruby 应用程序将无法利用您的所有处理器内核,但您的 JRuby 应用程序会很高兴地这样做。

但是,如果这不是问题,MRI 的线程(理论上,我还没有测试过)会快一点,因为它们是绿色线程,使用更少的系统资源。YARV (Ruby 1.9) 使用本机系统线程。

于 2009-06-16T03:56:09.007 回答
3

我是一个普通的 JRuby 用户,最大的不同是 JRuby 线程是真正并发的。它们实际上是系统级线程,因此它们可以在多个内核上同时执行。我不知道 MRI Ruby 1.8 代码在 JRuby 上运行速度较慢的任何地方。你可以考虑看看这个问题红宝石有真正的多线程吗?.

于 2009-06-16T03:50:33.153 回答