class Kamisama

Constants

VERSION

Public Class Methods

new(options, &block) click to toggle source
# File lib/kamisama.rb, line 11
def initialize(options, &block)
  @block            = block
  @instances        = options.fetch(:instances)
  @respawn_limit    = options.fetch(:respawn_limit, 3)
  @respawn_interval = options.fetch(:respawn_interval, 60)
  @monitor_sleep    = 2

  @term_signal_received = false

  @respawn_limiter = Kamisama::RespawnLimiter.new(@respawn_limit, @respawn_interval)

  @tasks = []
end
run(options = {}, &block) click to toggle source
# File lib/kamisama.rb, line 7
def self.run(options = {}, &block)
  new(options, &block).run
end

Public Instance Methods

add_worker() click to toggle source
# File lib/kamisama.rb, line 53
def add_worker
  puts "[Kamisama Master] #{Process.pid} Spawning new instance."

  @worker_index ||= 0
  @worker_index += 1

  task = Kamisama::Task.new(@worker_index, @block)
  task.start

  @tasks << task
end
handle_signals() click to toggle source
# File lib/kamisama.rb, line 36
def handle_signals
  trap("TTIN") do
    @instances += 1
  end

  trap("TTOU") do
    # make sure that we always have at least one running worker
    if @instances > 1
      @instances -= 1
    end
  end

  trap("TERM") do
    @term_signal_received = true
  end
end
monitor() click to toggle source
# File lib/kamisama.rb, line 72
def monitor
  loop do
    break if @term_signal_received

    add_worker  while @tasks.count < @instances
    term_worker while @tasks.count > @instances

    dead_tasks = @tasks.reject(&:alive?)

    dead_tasks.each do |task|
      @respawn_limiter.record!
      task.restart!
    end

    sleep(@monitor_sleep)
  end

  puts "[Kamisama Master] #{Process.pid} Terminating all instances"
  @tasks.each(&:terminate!)
  exit
end
run() click to toggle source
# File lib/kamisama.rb, line 25
def run
  puts "[Kamisama Master] Process id: #{Process.pid}"
  puts "[Kamisama Master] Starting #{@instances} workers. \n"

  @instances.times { add_worker }

  handle_signals

  monitor
end
term_worker() click to toggle source
# File lib/kamisama.rb, line 65
def term_worker
  puts "[Kamisama Master] #{Process.pid} Terminating an instance."

  task = @tasks.shift
  task.terminate!
end