更新了 Jörg 2011 年 9 月的评论
你似乎混淆了两个very这里有不同的东西:
Ruby 编程语言及其具体的线程模型之一
Ruby 编程语言的具体实现。那里
目前大约有 11 种不同的 Ruby 实现
编程语言,与very不同且独特的螺纹
楷模。
(不幸的是,这 11 个实现中只有两个实际上是
已准备好投入生产使用,但到今年年底这个数字
可能会增加到四到五个。)(Update:现在有 5 个:MRI、JRuby、YARV(Ruby 1.9 的解释器)、Rubinius 和 IronRuby)。
- 第一个实现实际上没有名称,
让人很尴尬地引用它,而且真的很烦人
令人困惑。它最常被称为“Ruby”,甚至
比没有名字更烦人、更令人困惑,因为它
导致 Ruby 的特性之间无休无止的混淆
编程语言和特定的 Ruby 实现。
有时也称为“MRI”(“Matz 的 Ruby”)
实现”)、CRuby 或 MatzRuby。
MRI 在其内部将 Ruby 线程实现为绿色线程
口译员 http://RedMine.Ruby-Lang.Org/repositories/annotate/ruby-18/ext/thread/thread.c。不幸的是,它不允许这些线程
要并行调度,它们只能同时运行一个线程
时间。
但是,可以运行任意数量的 C 线程(POSIX 线程等)
与 Ruby 线程并行,因此外部 C 库或 MRI
创建自己的线程的 C 扩展仍然可以在
平行线。
- 第二个实现是YARV http://WWW.AtDot.Net/yarv/(“然而
另一个 Ruby VM”)。YARV 将 Ruby 线程实现为 POSIX 或
Windows NT 线程 http://RedMine.Ruby-Lang.Org/repositories/annotate/ruby-19/thread.c,但是,它使用全局解释器
锁定(GIL)以确保实际上只有一个 Ruby 线程可以
安排在任何一个时间。
像 MRI、C 线程can实际上与 Ruby 线程并行运行。
未来,GIL 有可能might被打破
进入更细粒度的锁,从而允许越来越多的
代码实际上是并行运行的,但那是很遥远的事情,
甚至不planned yet.
-
JRuby https://www.jruby.org/ 将 Ruby 线程实现为本机线程 http://www.restlessprogrammer.com/2013/02/multi-threading-in-jruby.html,
其中 JVM 中的“本机线程”显然意味着“JVM
线程”。JRuby 没有对它们强加额外的锁定。所以,
这些线程是否实际上可以并行运行取决于
JVM:有些 JVM 将 JVM 线程实现为操作系统线程,有些则将
作为绿色线程。 (Sun/Oracle 的主流 JVM 自 JDK 1.3 起仅使用操作系统线程)
-
XRuby http://XRuby.GoogleCode.Com/ also 将 Ruby 线程实现为 JVM 线程 http://Code.Google.Com/p/xruby/source/browse/trunk/src/com/xruby/runtime/builtin/RubyThread.java#21. Update:XRuby 死了。
-
IronRuby http://IronRuby.Net/ 将 Ruby 线程实现为本机线程 http://IronRuby.RubyForge.Org/svn/trunk/src/IronRuby.Libraries/Builtins/ThreadOps.cs,
对于 CLR,“本机线程”显然意味着
“CLR 线程”。 IronRuby 没有对它们强加额外的锁定,
所以,只要你的 CLR 支持,它们就应该并行运行
那。
-
Ruby.NET http://RubyDotNetCompiler.GoogleCode.Com/ also 将 Ruby 线程实现为 CLR
线程数 http://Code.Google.Com/p/rubydotnetcompiler/source/browse/trunk/src/RubyRuntime/Built-in%20Classes/Thread.cs#21. Update:Ruby.NET 已死。
-
Rubinius http://Rubini.us/ 将 Ruby 线程实现为绿色线程
在其虚拟机内 https://GitHub.Com/EvanPhx/Rubinius/tree/master/kernel/core/thread.rb#L9。更准确地说:鲁比尼乌斯
VM导出非常轻量,非常灵活
并发/并行/非本地控制流构造,称为
A ”Task https://GitHub.Com/EvanPhx/Rubinius/tree/cpp/vm/builtin/task.cpp”,以及所有其他并发结构(线程中
这次讨论,还延续 https://GitHub.Com/EvanPhx/Rubinius/tree/master/kernel/core/continuation.rb#L45, Actors https://GitHub.Com/EvanPhx/Rubinius/tree/master/lib/actor.rb#L31和
其他东西)都是使用任务在纯 Ruby 中实现的。
Rubinius 无法(当前)并行调度线程,
然而,补充一下这并不是什么大问题:鲁比尼乌斯可以
已经在多个 POSIX 线程中运行多个 VM 实例
平行线 https://GitHub.Com/EvanPhx/Rubinius/tree/master/kernel/core/vm.rb#L5,在一个 Rubinius 过程中。由于线程是
实际上是用 Ruby 实现的,它们可以像任何其他 Ruby 一样
对象,被序列化并发送到不同VM中的不同
POSIX 线程。 (与 BEAM 相同型号Erlang http://Erlang.Org/虚拟机
用于 SMP 并发。已经是实施用于
鲁比纽斯 演员 https://GitHub.Com/EvanPhx/Rubinius/tree/master/lib/vmactor.rb.)
Update:此答案中有关 Rubinius 的信息是关于 Shotgun VM 的,该 VM 已不存在。 “新”C++ VM 不使用跨多个 VM 调度的绿色线程(即 Erlang/BEAM 风格),它使用更传统的具有多个本机操作系统线程模型的单个 VM,就像 CLR、Mono 使用的模型一样,以及几乎所有 JVM。
-
MacRuby http://MacRuby.Org/最初是 YARV 的一个港口,位于
Objective-C 运行时、CoreFoundation 和 Cocoa 框架。它
现在与 YARV 明显不同,但据我所知目前
仍然与 YARV 共享相同的线程模型 http://MacRuby.Org/trac/browser/MacRuby/trunk/thread.c?annotate=blame.
Update:MacRuby 依赖于苹果垃圾收集器,该垃圾收集器已被声明弃用,并将在 MacOSX 的后续版本中删除,MacRuby 是不死的。
-
Cardinal https://github.com/parrot/cardinal是一个 Ruby 实现鹦鹉
虚拟机 http://ParrotCode.Org/。然而,它还没有实现线程,
当它发生时,它可能会将它们实现为鹦鹉
线程数 http://SVN.Perl.Org/viewvc/parrot/trunk/src/thread.c?view=annotate. Update:红衣主教看起来非常不活跃/死气沉沉。
-
MagLev http://MagLev.GemStone.Com/是一个 Ruby 实现宝石/S
Smalltalk虚拟机 http://GemStone.Com/products/smalltalk/。我不知道什么线程模型
GemStone/S 使用什么线程模型 MagLev 使用什么线程模型或者即使
线程甚至还没有实现(可能还没有)。
-
HotRuby http://HotRuby.Yukoba.Jp/ is not其完整的 Ruby 实现
自己的。它是 YARV 字节码 VM 的实现
JavaScript。 HotRuby 还不支持线程(还?),什么时候支持
确实,它们将无法并行运行,因为 JavaScript
不支持真正的并行性。有一个动作脚本
然而,HotRuby 版本和 ActionScript 实际上可能
支持并行。Update:HotRuby 死了。
不幸的是,这 11 个 Ruby 实现中只有两个是
实际上已做好生产准备:MRI 和 JRuby。
因此,如果您想要真正的并行线程,JRuby 目前是您的选择
唯一的选择 – 这并不是一个坏选择:JRuby 实际上更快
比 MRI 更稳定。
否则,“经典”Ruby 解决方案是使用进程
而不是线程来实现并行性。 Ruby 核心库
包含Process module http://Ruby-Doc.Org/core/classes/Process.html与Process.fork
method http://Ruby-Doc.Org/core/classes/Process.html#M003179这使得分叉另一个 Ruby 变得非常容易
过程。此外,Ruby 标准库还包含分布式 Ruby (dRuby / dRb) http://Ruby-Doc.Org/stdlib/libdoc/drb/rdoc/库,它允许 Ruby
代码可以轻松地分布在多个进程中,而不是
不仅在同一台机器上,而且还可以跨网络。