我知道ruby使用绿色线程的“协作”线程。如何在应用程序中创建真正的“操作系统级”线程,以便使用多个cpu内核进行处理
更新了Jörg 2011年9月的评论
您似乎混淆了两个非常不同的东西:
Ruby编程语言及其一个具体的线程模型
Ruby编程语言的具体实现。那里
目前大约有11种不同的Ruby实现
编程语言,具有非常不同且独特的线程
模型
(不幸的是,在这11种实现中,只有两种是实际的。)
已准备好投入生产使用,但到今年年底,这一数字将下降
(更新:现在是5:MRI、JRuby、YARV(Ruby1.9的解释器)、Rubinius和IronRuby)
-
第一个实现实际上没有名称,这
提到它会让人觉得很尴尬,而且真的很烦人而且
令人困惑它通常被称为“Ruby”,甚至是
比没有名字更烦人更令人困惑,因为它
导致Ruby的功能之间无休止的混淆
编程语言和特定的Ruby实现有时也称为“MRI”(代表“Matz的Ruby”)
由CRuby或MatzRuby执行MRI在其内部以绿色线程的形式实现Ruby线程
口译译员不幸的是,它不允许这些线程
为了并行调度,它们一次只能运行一个线程
时间但是,可以运行任意数量的C线程(POSIX线程等)
与Ruby线程并行,因此外部C库或MRI
创建自己线程的C扩展仍然可以在中运行
平行 -
第二个实现是YARV(简写为“尚未”
另一个Ruby虚拟机“)。YARV将Ruby线程实现为POSIX或
然而,Windows NT线程使用全局解释器
锁定(GIL)以确保只有一个Ruby线程可以被实际访问
安排在任何时间与MRI一样,C线程实际上可以与Ruby线程并行运行
在未来,GIL可能会损坏
向下转换为更细粒度的锁,从而允许越来越多的
代码实际上是并行运行的,但这太遥远了
甚至还没有计划好 -
JRuby将Ruby线程实现为本机线程,
其中,JVM中的“本机线程”显然是指“JVM”
线程”。JRuby不会对它们施加额外的锁定。所以
这些线程是否能够真正并行运行取决于
JVM:一些JVM将JVM线程实现为操作系统线程,而另一些JVM则将JVM线程实现为操作系统线程
就像绿色的线一样。(自JDK1.3以来,Sun/Oracle的主流JVM只使用OS线程) -
XRuby还将Ruby线程实现为JVM线程更新:XRuby已死亡
-
IronRuby将Ruby线程实现为本机线程,
其中,对于CLR,“本机线程”显然意味着
“CLR线程”。IronRuby不会对它们施加额外的锁定,
因此,只要CLR支持,它们应该并行运行
那个 -
Ruby.NET还将Ruby线程实现为CLR
线程更新:Ruby.NET已死亡 -
Rubinius将Ruby线程实现为绿色线程
在它的虚拟机中。更准确地说:鲁宾尼乌斯
VM导出一个非常轻量级、非常灵活的
并发/并行/非本地控制流构造,称为
一个“任务”和所有其他并发构造(中的线程)
这是一次讨论,也是一次延续,参与者和
其他东西)是用纯Ruby实现的,使用任务Rubinius(当前)无法并行调度线程,
然而,他补充道,这并不是一个太大的问题:鲁宾尼乌斯可以
已在中的多个POSIX线程中运行多个VM实例
并行,在一个Rubinius进程内。因为线程是
它们实际上是用Ruby实现的,就像其他Ruby一样
对象,并将其序列化并发送到不同虚拟机中的不同虚拟机
POSIX线程。(这与BEAM Erlang VM的模型相同
用于SMP并发。它已针对实现
(鲁宾尼乌斯演员)更新:这个答案中关于Rubinius的信息是关于猎枪虚拟机的,它已经不存在了。“新”C++ VM不使用跨多个VM(即Erlang /Bar样式)调度的绿色线程,它使用了一个更传统的单一VM,它具有多个原生OS线程模型,就像CLR、莫诺河和几乎每个JVM所使用的一样。
-
MacRuby最初是作为YARV的一个港口,位于
Objective-C运行时、CoreFoundation和Cocoa框架。信息技术
现在与YARV有明显的分歧,但现在
仍然与YARV共享相同的线程模型。
更新:MacRuby依赖于Apple垃圾收集器,该垃圾收集器已声明不推荐使用,并将在MacOSX的更高版本中删除,MacRuby是不死生物 -
Cardinal是Parrot的Ruby实现
虚拟机。但是,它还没有实现线程,
当它这样做时,它可能会像鹦鹉一样实现它们
线程更新:红衣主教似乎非常不活跃/死亡 -
MagLev是GemStone/S的Ruby实现
Smalltalk虚拟机。我没有关于线程模型的信息
GemStone/S使用什么线程模型,MagLev使用什么线程模型,甚至
线程甚至还没有实现(可能没有) -
HotRuby不是its的完整Ruby实现
拥有它是虚拟机中YARV字节码的一个实现
JavaScript。HotRuby不支持线程(现在还不支持吗?),当它
但是,它们将无法并行运行,因为JavaScript
不支持真正的并行性。有一个动作脚本
然而,HotRuby版本和ActionScript实际上可能
支持并行性更新:HotRuby已死亡
不幸的是,这11个Ruby实现中只有两个是
实际生产准备就绪:MRI和JRuby
因此,如果您想要真正的并行线程,JRuby目前是您的首选
唯一的选择——这不是一个坏的选择:JRuby实际上更快
比核磁共振成像更稳定
否则,“经典”Ruby解决方案就是使用进程
而不是线程的并行性。Ruby核心库
包含带有Process.fork的Process模块
方法,这样就很容易找到另一个Ruby
过程另外,Ruby标准库包含
分布式Ruby(dRuby/dRb)库,允许Ruby
代码可以简单地分布在多个进程中,而不是
不仅在同一台机器上,而且在网络上