Ruby Fibers可以并发吗?
我试图在我的程序中加快速度,并且我被告知Ruby Fibers比线程更快,并且可以利用多个核心。 我环顾四周,但我找不到如何实际同时运行不同的纤维。 使用线程,您可以执行此操作:
threads = [] threads << Thread.new {Do something} threads << Thread.new {Do something} threads.each {|thread| thread.join}
我看不出怎么用纤维做这样的事情。 我所能找到的只是yield
和resume
,这似乎只是一堆起始和停止在纤维之间。 有没有办法与光纤进行真正的并发?
不,你不能用Fiber
做并发。 Fiber
不是一个并发构造,它们是一个控制流构造,就像Exception
一样。 这就是Fiber
的重点:它们从不并行运行,它们是合作的,它们是确定性的。 Fiber
是协程。 (事实上,我从来不明白为什么他们不简单地叫做Coroutine
。)
Ruby中唯一的并发构造是Thread
。
并发和并行之间似乎存在术语问题。
我无法找到如何实际同时运行不同的纤维。
我认为你实际上谈的是并行性,而不是并发性:
并发是指两个任务可以在重叠的时间段内启动,运行和完成。 这并不一定意味着它们都会在同一时刻运行。 例如。 在单核机器上进行多任务处理。 并行性是指任务在同一时间运行,例如。 在多核处理器上
引用: 并发与并行 – 有什么区别? 。
这里也很好地说明了: http : //concur.rspace.googlecode.com/hg/talk/concur.html#title-slide
那么回答这个问题:
Fibers是在Ruby中实现轻量级协同并发的原语。
这并不意味着它可以并行运行。
如果你想要真正的并发性,你会想要使用jruby的线程(实际上没有光纤,它只有线程,每根光纤一个)。
另一个选择是“分叉”到新的进程,这可以在MRI上以真正的并行方式运行。