class Opal::BuilderScheduler::Prefork::ForkSet

Public Class Methods

new(count, &block) click to toggle source
Calls superclass method
# File lib/opal/builder_scheduler/prefork.rb, line 76
def initialize(count, &block)
  super([])

  @count, @block = count, block

  create_fork
end

Public Instance Methods

close() click to toggle source
# File lib/opal/builder_scheduler/prefork.rb, line 123
def close
  each(&:close)
end
create_fork() click to toggle source
# File lib/opal/builder_scheduler/prefork.rb, line 115
def create_fork
  self << Fork.new(self, &@block)
end
from_io(io, type) click to toggle source
# File lib/opal/builder_scheduler/prefork.rb, line 119
def from_io(io, type)
  find { |i| i.__send__(type) == io }
end
get_events(queue_length) click to toggle source
# File lib/opal/builder_scheduler/prefork.rb, line 84
def get_events(queue_length)
  # Wait for anything to happen:
  # - Either any of our workers return some data
  # - Or any workers become ready to receive data
  #   - But only if we have enough work for them
  ios = IO.select(
    map(&:read_io),
    sample(queue_length).map(&:write_io),
    []
  )
  return [[], []] unless ios

  events = ios[0].map do |io|
    io = from_io(io, :read_io)
    [io, *io.recv]
  end

  idles = ios[1].map do |io|
    from_io(io, :write_io)
  end

  # Progressively create forks, because we may not need all
  # the workers at the time. The number 6 was picked due to
  # some trial and error on a Ryzen machine.
  #
  # Do note that prefork may happen more than once.
  create_fork if length < @count && rand(6) == 1

  [events, idles]
end
wait() click to toggle source
# File lib/opal/builder_scheduler/prefork.rb, line 127
def wait
  each(&:wait)
end