ruby有真正的多线程吗?

我知道ruby使用绿色线程的“协作”线程。如何在应用程序中创建真正的“操作系统级”线程,以便使用多个cpu内核进行处理

更新了Jörg 2011年9月的评论

您似乎混淆了两个非常不同的东西:
Ruby编程语言及其一个具体的线程模型
Ruby编程语言的具体实现。那里
目前大约有11种不同的Ruby实现
编程语言,具有非常不同且独特的线程
模型

(不幸的是,在这11种实现中,只有两种是实际的。)
已准备好投入生产使用,但到今年年底,这一数字将下降
(更新:现在是5:MRI、JRuby、YARV(Ruby1.9的解释器)、Rubinius和IronRuby)

  1. 第一个实现实际上没有名称,这
    提到它会让人觉得很尴尬,而且真的很烦人而且
    令人困惑它通常被称为“Ruby”,甚至是
    比没有名字更烦人更令人困惑,因为它
    导致Ruby的功能之间无休止的混淆
    编程语言和特定的Ruby实现

    有时也称为“MRI”(代表“Matz的Ruby”)
    由CRuby或MatzRuby执行

    MRI在其内部以绿色线程的形式实现Ruby线程
    口译译员不幸的是,它不允许这些线程
    为了并行调度,它们一次只能运行一个线程
    时间

    但是,可以运行任意数量的C线程(POSIX线程等)
    与Ruby线程并行,因此外部C库或MRI
    创建自己线程的C扩展仍然可以在中运行
    平行

  2. 第二个实现是YARV(简写为“尚未”
    另一个Ruby虚拟机“)。YARV将Ruby线程实现为POSIX或
    然而,Windows NT线程使用全局解释器
    锁定(GIL)以确保只有一个Ruby线程可以被实际访问
    安排在任何时间

    与MRI一样,C线程实际上可以与Ruby线程并行运行

    在未来,GIL可能会损坏
    向下转换为更细粒度的锁,从而允许越来越多的
    代码实际上是并行运行的,但这太遥远了
    甚至还没有计划好

  3. JRuby将Ruby线程实现为本机线程,
    其中,JVM中的“本机线程”显然是指“JVM”
    线程”。JRuby不会对它们施加额外的锁定。所以
    这些线程是否能够真正并行运行取决于
    JVM:一些JVM将JVM线程实现为操作系统线程,而另一些JVM则将JVM线程实现为操作系统线程
    就像绿色的线一样。(自JDK1.3以来,Sun/Oracle的主流JVM只使用OS线程)

  4. XRuby还将Ruby线程实现为JVM线程更新:XRuby已死亡

  5. IronRuby将Ruby线程实现为本机线程,
    其中,对于CLR,“本机线程”显然意味着
    “CLR线程”。IronRuby不会对它们施加额外的锁定,
    因此,只要CLR支持,它们应该并行运行
    那个

  6. Ruby.NET还将Ruby线程实现为CLR
    线程更新:Ruby.NET已死亡

  7. 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所使用的一样。

  8. MacRuby最初是作为YARV的一个港口,位于
    Objective-C运行时、CoreFoundation和Cocoa框架。信息技术
    现在与YARV有明显的分歧,但现在
    仍然与YARV共享相同的线程模型。
    更新:MacRuby依赖于Apple垃圾收集器,该垃圾收集器已声明不推荐使用,并将在MacOSX的更高版本中删除,MacRuby是不死生物

  9. Cardinal是Parrot的Ruby实现
    虚拟机。但是,它还没有实现线程,
    当它这样做时,它可能会像鹦鹉一样实现它们
    线程更新:红衣主教似乎非常不活跃/死亡

  10. MagLev是GemStone/S的Ruby实现
    Smalltalk虚拟机。我没有关于线程模型的信息
    GemStone/S使用什么线程模型,MagLev使用什么线程模型,甚至
    线程甚至还没有实现(可能没有)

  11. 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
代码可以简单地分布在多个进程中,而不是
不仅在同一台机器上,而且在网络上

发表评论