module Bucky::Core::TestCore::ParallelHelper

Private Instance Methods

parallel_distribute_into_workers(data_set, max_processes, &block) click to toggle source
# File lib/bucky/core/test_core/test_manager.rb, line 45
def parallel_distribute_into_workers(data_set, max_processes, &block)
  # Group the data by remainder of index
  data_set_grouped = data_set.group_by.with_index { |_elem, index| index % max_processes }
  # Use 'values' method to get only hash's key into an array
  data_set_grouped.values.each do |data_for_pre_worker|
    # Number of child process is equal to max_processes (or equal to data_set length when data_set length is less than max_processes)
    fork do
      data_for_pre_worker.each { |data| block.call(data) }
    end
  end
  # Handle all exit code in waitall
  Process.waitall.each do |child|
    Bucky::Core::TestCore::ExitHandler.instance.raise unless child[1].exitstatus.zero?
  end
end
parallel_new_worker_each(data_set, max_processes, &block) click to toggle source
# File lib/bucky/core/test_core/test_manager.rb, line 22
def parallel_new_worker_each(data_set, max_processes, &block)
  # Max parallel workers number
  available_workers = max_processes

  # If child process dead, available workers increase
  Signal.trap('CLD') { available_workers += 1 }

  data_set.each do |data|
    # Wait until worker is available and handle exit code from previous process
    unless available_workers.positive?
      Process.wait
      Bucky::Core::TestCore::ExitHandler.instance.raise unless $CHILD_STATUS.exitstatus.zero?
    end
    # Workers decrease when start working
    available_workers -= 1
    fork { block.call(data) }
  end
  # Handle all exit code in waitall
  Process.waitall.each do |child|
    Bucky::Core::TestCore::ExitHandler.instance.raise unless child[1].exitstatus.zero?
  end
end