# Fibers are primitives for implementing light weight cooperative concurrency in # Ruby. Basically they are a means of creating code blocks that can be paused # and resumed, much like threads. The main difference is that they are never # preempted and that the scheduling must be done by the programmer and not the VM. require 'fiber' f = Fiber.new do |value| first = value puts "first call fiber with args: #{first ? first : 'not passed'}" second = Fiber.yield puts "second call fiber with args: #{second ? second : 'not passed'}" other = Fiber.yield puts "First: #{first}, Second: #{second}, Other: #{other ? other : 'not passed'}" puts "Last call" end f.resume('First argument') f.resume('Second argument') f.resume # f.resume call error if try call one more time fiber is dead