13

我正在尝试加快我的程序的速度,并且有人告诉我 Ruby Fibers 比线程快,并且可以利用多个内核。我环顾四周,但我就是找不到如何实际同时运行不同的光纤。使用线程,您可以这样做:

threads = []

threads << Thread.new {Do something}
threads << Thread.new {Do something}

threads.each {|thread| thread.join}

我看不出如何用纤维做这样的事情。我所能找到的只是yieldresume这似乎只是纤维之间的一堆开始和停止。有没有办法用纤程实现真正的并发?

4

3 回答 3

15

不,您不能与Fibers 进行并发。Fibers 根本不是并发构造,它们是控制流构造,就像Exceptions。这就是 s 的全部意义Fiber:它们从不并行运行,它们是合作的,它们是确定性的。Fibers 是协程。(事实上​​,我一直不明白为什么它们不被简单地称为Coroutines。)

Ruby 中唯一的并发构造是Thread.

于 2010-06-18T00:07:20.870 回答
14

并发性和并行性之间似乎存在术语问题。

我只是找不到如何实际同时运行不同的光纤。

我认为您实际上谈论的是并行性,而不是并发性:

并发是指两个任务可以在重叠的时间段内启动、运行和完成。这并不一定意味着它们会同时运行。例如。在单核机器上进行多任务处理。并行性是指任务实际上同时运行,例如。在多核处理器上

引用:并发与并行 - 有什么区别?.

这里也有很好的说明:http: //concur.rspace.googlecode.com/hg/talk/concur.html#title-slide

所以回答这个问题:

Fiber 是在 Ruby 中实现轻量级协作并发的原语。

http://www.ruby-doc.org/core-2.1.1/Fiber.html

这并不意味着它可以并行运行。

于 2014-05-15T15:16:39.007 回答
1

如果您想要真正的并发性,您将需要使用带有 jruby 的线程(它实际上没有光纤,它只有线程,每个光纤一个)。

另一种选择是“分叉”到新进程,这可以在 MRI 上真正并行运行。

于 2010-06-19T20:27:55.193 回答