Sha256: c26b5e33a75593a0229c8dedb2f3fe27cf535a9d5eed2974b960eb5119e190bf

Contents?: true

Size: 1.76 KB

Versions: 22

Compression:

Stored size: 1.76 KB

Contents

# frozen_string_literal: true

require 'bundler/setup'
require 'polyphony'
require 'json'

require 'fileutils'
FileUtils.cd(__dir__)

require_relative 'agent'

class AgentManager
  def initialize
    @running_agents = {}
    @pending_actions = Queue.new
    @processor = spin_loop { process_pending_action }
  end

  def process_pending_action
    action = @pending_actions.shift
    case action[:kind]
    when :start
      start_agent(action[:spec])
    when :stop
      stop_agent(action[:spec])
    end
  end

  def start_agent(spec)
    return if @running_agents[spec]

    @running_agents[spec] = spin do
      while true
        launch_agent_from_spec(spec)
        sleep 1
      end
    ensure
      @running_agents.delete(spec)
    end
  end

  def stop_agent(spec)
    fiber = @running_agents[spec]
    return unless fiber

    fiber.terminate
    fiber.await
  end

  def update
    return unless @pending_actions.empty?

    current_specs = @running_agents.keys
    updated_specs = agent_specs

    to_start = updated_specs - current_specs
    to_stop = current_specs - current_specs

    to_start.each { |s| @pending_actions << { kind: :start, spec: s } }
    to_stop.each { |s| @pending_actions << { kind: :stop, spec: s } }
  end

  def run
    every(2) { update }
  end
end

class RealityAgentManager < AgentManager
  def agent_specs
    (1..400).map { |i| { id: i } }
  end

  def launch_agent_from_spec(spec)
    # Polyphony::Process.watch("ruby agent.rb #{spec[:id]}")
    Polyphony::Process.watch do
      spin_loop(interval: 60) { GC.start }
      agent = SampleAgent.new(spec[:id], '/tmp/df.sock')
      puts "Starting agent #{spec[:id]} pid: #{Process.pid}"
      agent.run
    end
  end
end

puts "Agent manager pid: #{Process.pid}"

manager = RealityAgentManager.new
manager.run

Version data entries

22 entries across 22 versions & 1 rubygems

Version Path
tipi-0.55 df/multi_agent_supervisor.rb
tipi-0.54 df/multi_agent_supervisor.rb
tipi-0.53 df/multi_agent_supervisor.rb
tipi-0.52 df/multi_agent_supervisor.rb
tipi-0.51 df/multi_agent_supervisor.rb
tipi-0.50 df/multi_agent_supervisor.rb
tipi-0.49 df/multi_agent_supervisor.rb
tipi-0.47 df/multi_agent_supervisor.rb
tipi-0.46 df/multi_agent_supervisor.rb
tipi-0.45 df/multi_agent_supervisor.rb
tipi-0.43 df/multi_agent_supervisor.rb
tipi-0.42 df/multi_agent_supervisor.rb
tipi-0.41 df/multi_agent_supervisor.rb
tipi-0.40 df/multi_agent_supervisor.rb
tipi-0.39 df/multi_agent_supervisor.rb
tipi-0.38 df/multi_agent_supervisor.rb
tipi-0.37.2 df/multi_agent_supervisor.rb
tipi-0.37.1 df/multi_agent_supervisor.rb
tipi-0.37 df/multi_agent_supervisor.rb
tipi-0.36 df/multi_agent_supervisor.rb