Sha256: fbdbd28f65c6d8d254085c8939fec631a95240d6ae107ca7b346b058f6c267ae

Contents?: true

Size: 970 Bytes

Versions: 12

Compression:

Stored size: 970 Bytes

Contents

# frozen_string_literal: true

require 'bundler/setup'
require 'polyphony'

class Supervisor
  def initialize(*fibers)
    @fiber = spin { do_supervise }
    @fiber.message_on_child_termination = true
    fibers.each { |f| add(f) }
  end

  def await
    @fiber.await
  end

  def spin(tag = nil, &block)
    @fiber.spin(tag, &block)
  end

  def add(fiber)
    fiber.attach(@fiber)
  end

  def do_supervise
    loop do
      msg = receive
      # puts "Supervisor received #{msg.inspect}"
      f, r = msg
      puts "Fiber #{f.tag} terminated with #{r.inspect}, restarting..."
      f.restart
    end
  end
end

def supervise(*fibers)
  supervisor = Supervisor.new(*fibers)
  supervisor.await
end

def start_worker(id)
  spin_loop(:"worker#{id}") do
    duration = rand(0.5..1.0)
    puts "Worker #{id} sleeping for #{duration} seconds"
    sleep duration
    raise 'foo' if rand > 0.7
    break if rand > 0.6
  end  
end

supervise(start_worker(1), start_worker(2))

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
polyphony-0.71 examples/core/message_based_supervision.rb
polyphony-0.70 examples/core/message_based_supervision.rb
polyphony-0.69 examples/core/message_based_supervision.rb
polyphony-0.68 examples/core/message_based_supervision.rb
polyphony-0.67 examples/core/message_based_supervision.rb
polyphony-0.66 examples/core/message_based_supervision.rb
polyphony-0.65 examples/core/message_based_supervision.rb
polyphony-0.64 examples/core/message_based_supervision.rb
polyphony-0.63 examples/core/message_based_supervision.rb
polyphony-0.62 examples/core/message_based_supervision.rb
polyphony-0.61 examples/core/message_based_supervision.rb
polyphony-0.60 examples/core/message_based_supervision.rb