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

  require 'mega/coroutine'

  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
  puts

Author(s)

  • Florian Frank
Methods
Public Class methods
new(data = {}) {|self| ...} [ source ]
Public Instance methods
[](name) [ source ]
[]=(name, value) [ source ]
resume(other) [ source ]
run() [ source ]
stop() [ source ]