我正试图在我的程序中加快速度,并且我被告知Ruby Fibers比线程更快并且可以利用多个核心。我环顾四周,但我找不到如何实际同时运行不同的纤维。使用线程,您可以执行此操作:
threads = []
threads << Thread.new {Do something}
threads << Thread.new {Do something}
threads.each {|thread| thread.join}
我看不出如何用纤维做这样的事情。我能找到的只有yield
和resume
,这似乎只是一堆起始和停止在光纤之间。有没有办法用光纤进行真正的并发?
答案 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中实现轻量级协同并发的原语。
这并不意味着它可以并行运行。
答案 2 :(得分:1)
如果你想要真正的并发性,你会想要使用jruby的线程(实际上没有光纤,它只有线程,每根光纤一个)。
另一个选择是“分叉”到新的进程,这可以在MRI上以真正的并行方式运行。