Ruby Enterprise使用绿色线程吗?

3
我曾经困惑这个问题,除了这个之外,我什么也没有找到。
“线程调度程序错误修复和性能改进。在Ruby Enterprise Edition上进行线程处理的速度可以比官方版本的Ruby 1.8快10倍以上。”

我希望信息附带“使用期限”! - Andrew Grimm
2个回答

6
REE源自MRI 1.8.7。因此,它只使用了绿色线程。REE在某些部分更改了1.8.7的功能(尤其是在内存管理和垃圾收集方面)。但它仍然广泛遵循上游MRI(原始Matz's Ruby Interpreter)的设计。
虽然YARV(1.9)切换到了操作系统本地线程,但它们仍然具有全局解释器锁,确保仅有一个线程在任何时候运行。
有几个Ruby实现支持操作系统本地线程且没有GIL。最著名的是基于JVM的JRuby和带有自己VM的Rubinius。这些实现提供“真正”的并发线程。

+1 尽管我想指出,在使用Ruby线程时,并不总是会启用GIL。因此,即使在像GIL这样的概念下,使用线程可能是违反直觉的,但通常仍然有意义。 - emboss
好的,有了GIL,您仍然可以模拟“并发”序列。因此,尽管每个指令只能一个接一个地执行,但代码流(或序列)是并发的。这使得像EventMachine这样的东西即使在GIL实现上也非常高效。 - Holger Just

5
除了JRuby和Rubinius已经完全摆脱解释器锁之外,就并发性而言,CRuby/MRI的情况也有所进展。
一个值得注意的特点是,随着中村成洋(Narihiro Nakamura)的位图标记GC,自Ruby 2.0以来,REE相对于CRuby的另一个优势也将消失:REE具有适用于复制写友好型GC算法,这使得它通过进程(forking)而不是线程实现并发变得更加吸引人。新的位图标记GC将具有同样的优点,在forking新进程时可以节省不必要的内存复制。

GIL(全局解释器锁,官方称为GVL)并不像听起来那么糟糕。例如,在进行IO操作时,Ruby会释放解释器锁(参见此处)。最近我们经常看到的另一个特性是,C扩展开发者有能力通过调用rb_thread_blocking_region手动释放锁,这将在GIL被释放的情况下执行一个C级别的函数。如果某个C操作可以保证没有副作用,那么这可能会产生巨大的影响。一个很好的例子是RSA密钥生成 - 这完全在由OpenSSL分配的内存中运行,因此我们可以安全地释放GIL。

引入于1.9版本的Fiber或最近的项目Celluloid,与几年前相比,更加友好地展示了Ruby并发的状态。

最后但并非最不重要的,CRuby VM 的作者 Koichi Sasada 正在积极开发 MVM 技术,该技术将允许在单个 Ruby 进程中运行多个 VM,从而以另一种方式实现并发。
考虑到所有其他性能改进,越来越少的理由使用 REE,安全地切换到 1.9.3 或 2.0.0 是可行的,特别是因为 1.8 系列将不再得到积极开发,并且许多流行项目已经宣布很快将停止对 1.8 的支持。
编辑:
正如 Holger 指出的那样,REE 也已经EOLed,并且不会有 1.9 或更高版本的移植。因此,切换不仅是安全的,而且是正确的 :)

2
可以补充一下,REE已经正式EOL(http://blog.phusion.nl/2012/02/21/ruby-enterprise-edition-1-8-7-2012-02-released-end-of-life-imminent/),并且不会被移植到1.9系列。 - Holger Just
@HolgerJust 是的,说得好。不仅可以安全地切换,而且实际上是正确的做法 :) 我会加上你的评论。 - emboss
1
很棒的信息,但它并没有真正回答问题。 - echristopherson
@echristopherson:你说得对。Holger在这方面做得很好。我的回答更多是针对“REE比Ruby 1.8快十倍”的回复,想指出这对于当前版本来说已经不再正确。 - emboss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接