Ruby Fibers可以并发吗?

Jes*_*sky 13 ruby concurrency fibers

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

threads = []

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

threads.each {|thread| thread.join}
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 16

不,你不能用Fibers 做并发.Fibers根本不是并发构造,它们是一个控制流构造,就像Exceptions 一样.这就是整点FiberS:他们从来不并行运行,他们的合作,他们是确定性的.Fiber是协程.(事实上​​,我从未明白为什么他们不仅仅被称为Coroutines.)

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

  • 我的印象是,协同例程是一种并发形式,OP实际上意味着要求你能用Ruby光纤做_parallelism_(你不应该这样做). (6认同)
  • `Fibers`是并发结构. (5认同)

wac*_*cha 13

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

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

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

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

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

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

所以回答这个问题:

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

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

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