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