Ruby Fibers可以并发吗?

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

threads = [] threads << Thread.new {Do something} threads << Thread.new {Do something} threads.each {|thread| thread.join} 

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

不,你不能用Fiber做并发。 Fiber不是一个并发构造,它们是一个控制流构造,就像Exception一样。 这就是Fiber的重点:它们从不并行运行,它们是合作的,它们是确定性的。 Fiber是协程。 (事实上​​,我从来不明白为什么他们不简单地叫做Coroutine 。)

Ruby中唯一的并发构造是Thread

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

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

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

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

引用: 并发与并行 – 有什么区别? 。

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

那么回答这个问题:

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

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

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

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

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