Can Ruby Fibers be Concurrent?
I'm trying to get some speed up in my program and I've been told that Ruby Fibers are faster than threads and can take advantage of multiple cores. I've looked around, but I just can't find how to actually run different fibers concurrently. With threads you can do this:
threads = []
threads << Thread.new {Do something}
threads << Thread.new {Do something}
threads.each {|thread| thread.join}
I can't see how to do something like this with fibers. All I can find is yield
and resume
which seems like just a bunch of starting and stopping between the fibers. Is there a way to do true concurrency with fibers?
No, you cannot do concurrency with Fiber
s. Fiber
s simply aren't a concurrency construct, they are a control-flow construct, like Exception
s. That's the whole point of Fiber
s: they never run in parallel, they are cooperative and they are deterministic. Fiber
s are coroutines. (In fact, I never understood why they aren't simply called Coroutine
s.)
The only concurrency construct in Ruby is Thread
.
There seems to be a terminology issue between concurrency and parallelism.
I just can't find how to actually run different fibers concurrently.
I think you actually talk about parallelism, not about concurrency:
Concurrency is when two tasks can start, run, and complete in overlapping time periods. It doesn't necessarily mean they'll ever both be running at the same instant. Eg. multitasking on a single-core machine. Parallelism is when tasks literally run at the same time, eg. on a multicore processor
Quoting: Concurrency vs Parallelism - What is the difference?.
Also well illustrated here: http://concur.rspace.googlecode.com/hg/talk/concur.html#title-slide
So to answer the question:
Fibers are primitives for implementing light weight cooperative concurrency in Ruby.
http://www.ruby-doc.org/core-2.1.1/Fiber.html
Which doesn't mean it can run in parallel.
如果你想要真正的并发性,你会想用jruby使用线程,我相信。
链接地址: http://www.djcxy.com/p/13928.html上一篇: 为什么OCaml的线程被认为是“不够”?
下一篇: Ruby Fibers可以并行吗?