Coroutines are program components like subroutines. Coroutines are more
generic and flexible than subroutines, but are less widely used in
practice. Coroutines were first introduced natively in Simula. Coroutines
are well suited for implementing more familiar program components such as
cooperative tasks, iterators, infinite lists, and pipes.
Usage
count = (ARGV.shift || 1000).to_i
input = (1..count).map { (rand * 10000).round.to_f / 100}
Producer = Coroutine.new do |me|
loop do
1.upto(6) do
me[:last_input] = input.shift
me.resume(Printer)
end
input.shift # discard every seventh input number
end
end
Printer = Coroutine.new do |me|
loop do
1.upto(8) do
me.resume(Producer)
if Producer[:last_input]
print Producer[:last_input], "\t"
Producer[:last_input] = nil
end
me.resume(Controller)
end
puts
end
end
Controller = Coroutine.new do |me|
until input.empty? do
me.resume(Printer)
end
end
Controller.run