红宝石有真正的多线程吗?
我知道红宝石使用绿色线程的"合作"线程。如何在应用程序中创建真正的" OS级"线程,以便利用多个cpu内核进行处理?
解决方案
回答
Ruby 1.8仅具有绿色线程,无法创建真正的" OS级"线程。但是,ruby 1.9将具有称为纤维的新功能,该功能将允许我们创建实际的OS级线程。不幸的是,Ruby 1.9仍处于beta中,计划在几个月内保持稳定。
另一种选择是使用JRuby。 JRuby将线程实现为OS级主题,其中没有"绿色线程"。 JRuby的最新版本是1.1.4,并且等效于Ruby 1.8
回答
如何使用drb?它不是真正的多线程,而是几个进程之间的通信,但是我们现在可以在1.8中使用它,并且摩擦很小。
回答
如果使用MRI,则可以将C中的线程代码作为扩展名或者使用ruby-inline gem编写。
回答
如果我们真的需要在Ruby中为生产级系统(不能使用Beta)进行并行处理,则处理可能是一个更好的选择。
但是,绝对值得首先在JRuby下尝试线程。
另外,如果我们对将来在Ruby下进行线程化感兴趣,则可能会发现本文很有用。
回答
更新了J?rg 2011年9月的评论
我们似乎在这里混淆了两个截然不同的事情:
Ruby编程语言和特定的线程模型之一
Ruby编程语言的特定实现。那里
目前大约有11种不同的Ruby实现
编程语言,具有非常不同和独特的线程
楷模。
(不幸的是,这11个实现中只有两个是
准备用于生产,但到今年年底该数字
可能会增加到四到五个。)(更新:现在是5:MRI,JRuby,YARV(Ruby 1.9的解释器),Rubinius和IronRuby。
- 第一个实现实际上没有名称,这使得引用它变得很尴尬,而且确实令人烦恼和混乱。它最常被称为" Ruby",它比没有名字更令人讨厌和混乱,因为它导致Ruby编程语言的功能和特定的Ruby实现之间的无休止的混淆。它有时也称为" MRI"(对于" Matz的Ruby实现"而言),CRuby或者MatzRuby。 MRI在其解释器中将Ruby Threads实现为Green Threads。不幸的是,它不允许并行调度这些线程,它们一次只能运行一个线程。但是,任意数量的C线程(POSIX线程等)都可以与Ruby线程并行运行,因此创建自己的线程的外部C库或者MRI C扩展仍可以并行运行。
- 第二种实现是YARV(YATV)("另一个Ruby VM"的缩写)。 YARV将Ruby线程实现为POSIX或者Windows NT线程,但是,它使用全局解释器锁(GIL)来确保实际上一次只能调度一个Ruby线程。像MRI一样,C线程实际上可以与Ruby线程并行运行。将来,GIL可能会分解为更细粒度的锁,从而允许越来越多的代码实际并行运行,但是距离很远,甚至还没有计划。
- JRuby将Ruby线程实现为本地线程,其中,在JVM的情况下,"本地线程"显然意味着" JVM线程"。 JRuby没有对它们施加任何额外的锁定。因此,这些线程是否可以实际并行运行取决于JVM:某些JVM将JVM线程实现为OS线程,而另一些实现为Green线程。 (从JDK 1.3开始,Sun / Oracle的主流JVM仅使用OS线程)
- XRuby还将Ruby Threads实现为JVM Threads。更新:XRuby已死。
- IronRuby将Ruby线程实现为本地线程,其中在CLR情况下,"本地线程"显然意味着" CLR线程"。 IronRuby没有对它们施加任何额外的锁定,因此,只要CLR支持,它们就应该并行运行。
- Ruby.NET还将Ruby线程实现为CLR线程。更新:Ruby.NET已死。
- Rubinius在其虚拟机中将Ruby线程实现为绿色线程。更准确地说:Rubinius VM导出一个非常轻便,非常灵活的并发/并行/非本地控制流构造(称为"任务")以及所有其他并发构造(本讨论中的线程,以及Continuation,Actor和其他内容) )是使用Tasks在纯Ruby中实现的。 Rubinius不能(当前)并行调度线程,但是,这并没有太大的问题:Rubinius可以在一个Rubinius进程中并行运行多个POSIX线程中的多个VM实例。由于线程实际上是在Ruby中实现的,因此它们可以像任何其他Ruby对象一样被序列化并发送到不同POSIX线程中的不同VM。 (这与BEAM Erlang VM用于SMP并发的模型相同。已经为Rubinius Actors实施了该模型。)更新:此答案中有关Rubinius的信息与Shotgun VM有关,不再存在。 "新的" C ++ VM不使用跨多个VM调度的绿色线程(即Erlang / BEAM样式),它使用具有多个本机OS线程模型的更传统的单个VM,就像CLR,Mono所采用的那样,几乎每个JVM。
- MacRuby最初是在Objective-C运行时,CoreFoundation和Cocoa框架之上的YARV移植。现在它与YARV有很大的出入,但是AFAIK目前仍与YARV共享相同的线程模型。更新:MacRuby依赖于已宣布弃用的苹果垃圾收集器,并将在更高版本的MacOSX中将其删除,因此MacRuby是不死的。
- Cardinal是用于Parrot虚拟机的Ruby实现。它还没有实现线程,但是,当它实现时,可能会将它们实现为Parrot Threads。更新:红衣主教似乎非常不活跃/死了。
- MagLev是GemStone / S Smalltalk VM的Ruby实现。我不知道GemStone / S使用什么线程模型,MagLev使用什么线程模型,甚至还没有实现线程(可能还没有实现)。
- HotRuby并不是自己的完整Ruby实现。它是JavaScript中YARV字节码VM的实现。 HotRuby不支持线程(还可以吗?),当支持时,它们将不能并行运行,因为JavaScript不支持真正的并行性。但是,有一个ActionScript版本的HotRuby,而ActionScript实际上可能支持并行性。更新:HotRuby已死。
不幸的是,这11个Ruby实现中只有两个是
实际可用于生产的产品:MRI和JRuby。
因此,如果我们想要真正的并行线程,那么JRuby当前是
唯一的选择?并不是说那是一个不好的:JRuby实际上更快
比MRI更可靠。
否则,"经典" Ruby解决方案是使用流程
而不是并行线程。 Ruby核心库
包含带有Process.fork的Process模块
方法,使得分叉另一个Ruby很容易
过程。此外,Ruby标准库还包含
分布式Ruby(dRuby / dRb)库,允许使用Ruby
将代码分散在多个进程中,而不是
只能在同一台计算机上,也可以跨网络。
回答
这是有关Rinda的一些信息,它是Linda的Ruby实现(并行处理和分布式计算范例)http://charmalloc.blogspot.com/2009/12/linda-tuples-rinda-drb-parallel.html