我正试图在我的程序中获得一些速度,我被告知Ruby Fibers比线程更快,并且可以利用多核的优势。我环顾了四周,但我就是找不到如何同时运行不同的纤程。使用线程,您可以执行以下操作:
threads = []
threads << Thread.new {Do something}
threads << Thread.new {Do something}
threads.each {|thread| thread.join}我不知道怎么用纤维做这样的事情。我能找到的只有yield和resume,它们看起来就像是纤维之间的一堆开始和停止。有没有办法用纤程实现真正的并发性?
发布于 2010-06-18 08:07:21
不,你不能用Fibers进行并发。Fibers根本不是一个并发构造,它们是一个控制流构造,就像Exceptions一样。这就是Fibers的全部要点:它们从不并行运行,它们是协作的,它们是确定性的。Fiber是协程。(事实上,我从来不明白为什么它们不被简单地称为Coroutines。)
Ruby中唯一的并发构造是Thread。
发布于 2014-05-15 23:16:39
并发性和并行性之间似乎存在术语问题。
,我就是找不到如何同时运行不同的纤程。
我认为你实际上谈论的是并行性,而不是并发性:
Concurrency是指两个任务可以在重叠的时间段内启动、运行和完成。这并不一定意味着它们会同时运行。例如:在单核机器上进行多任务处理。Parallelism是指任务从字面上看同时运行,例如。在多核处理器上
引用:Concurrency vs Parallelism - What is the difference?。
这里还很好地说明了:http://concur.rspace.googlecode.com/hg/talk/concur.html#title-slide
所以我要回答这个问题:
Ruby是在
中实现轻量级协作并发的原语。
http://www.ruby-doc.org/core-2.1.1/Fiber.html
这并不意味着它可以并行运行。
发布于 2010-06-20 04:27:55
如果你想要真正的并发性,你会想要在jruby中使用线程(它实际上没有纤程,它只有线程,每个纤程一个)。
另一种选择是“分叉”到新的进程,它可以在MRI上真正并行运行。
https://stackoverflow.com/questions/3066392
复制相似问题