class Opal::BuilderScheduler::Prefork::ForkSet
def close
def close each(&:close) end
def create_fork
def create_fork self << Fork.new(self, &@block) end
def from_io(io, type)
def from_io(io, type) find { |i| i.__send__(type) == io } end
def get_events(queue_length)
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
def initialize(count, &block)
def initialize(count, &block) super([]) @count, @block = count, block create_fork end
def wait
def wait each(&:wait) end