Ruby Fibers可以并发吗?

时间:2010-06-17 23:48:46

标签: ruby concurrency fibers

我正试图在我的程序中加快速度,并且我被告知Ruby Fibers比线程更快并且可以利用多个核心。我环顾四周,但我找不到如何实际同时运行不同的纤维。使用线程,您可以执行此操作:

threads = []

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

threads.each {|thread| thread.join}

我看不出如何用纤维做这样的事情。我能找到的只有yieldresume,这似乎只是一堆起始和停止在光纤之间。有没有办法用光纤进行真正的并发?

3 个答案:

答案 0 :(得分:16)

不,你不能与Fiber进行并发。 Fiber只是不是并发构造,它们是一个控制流构造,如Exception s。那是Fiber整点:他们从不并行运行,他们是合作的,他们是确定性的。 Fiber是协程。 (事实上​​,我从未理解为什么它们不仅仅被称为Coroutine s。)

Ruby中唯一的并发构造是Thread

答案 1 :(得分:13)

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

  

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

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

  

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

     

引用:Concurrency vs Parallelism - What is the difference?

     

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

所以回答这个问题:

  

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

     

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

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

答案 2 :(得分:1)

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

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