class Bootsnap::CLI::WorkerPool
Public Class Methods
create(size:, jobs:)
click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 6 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 83 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 98 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 115 def free_worker IO.select(nil, @workers)[1].sample end
push(*args)
click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 119 def push(*args) @queue.push(args) nil end
shutdown()
click to toggle source
# File lib/bootsnap/cli/worker_pool.rb, line 124 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 90 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