class Bootsnap::CLI::WorkerPool

Public Class Methods

create(size:, jobs:) click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 7
def create(size:, jobs:)
  if size > 0 && Process.respond_to?(:fork)
    new(size: size, jobs: jobs)
  else
    Inline.new(jobs: jobs)
  end
end
new(size:, jobs: {}) click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 84
def initialize(size:, jobs: {})
  @size = size
  @jobs = jobs
  @queue = Queue.new
  @pids = []
end

Public Instance Methods

dispatch_loop() click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 99
def dispatch_loop
  loop do
    case job = @queue.pop
    when nil
      @workers.each do |worker|
        worker.write([:exit])
        worker.close
      end
      return true
    else
      unless @workers.sample.write(job, block: false)
        free_worker.write(job)
      end
    end
  end
end
free_worker() click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 116
def free_worker
  IO.select(nil, @workers)[1].sample
end
push(*args) click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 120
def push(*args)
  @queue.push(args)
  nil
end
shutdown() click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 125
def shutdown
  @queue.close
  @dispatcher_thread.join
  @workers.each do |worker|
    _pid, status = Process.wait2(worker.pid)
    return status.exitstatus unless status.success?
  end
  nil
end
spawn() click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 91
def spawn
  @workers = @size.times.map { Worker.new(@jobs) }
  @workers.each(&:spawn)
  @dispatcher_thread = Thread.new { dispatch_loop }
  @dispatcher_thread.abort_on_exception = true
  true
end