class Piggly::Util::ProcessQueue

Executes blocks in parallel subprocesses

Public Class Methods

concurrent() click to toggle source
# File lib/piggly/util/process_queue.rb, line 13
def self.concurrent
  @concurrent || 1
end
concurrent=(count) click to toggle source
# File lib/piggly/util/process_queue.rb, line 9
def self.concurrent=(count)
  @concurrent = count
end
new(concurrent = self.class.concurrent) click to toggle source
# File lib/piggly/util/process_queue.rb, line 17
def initialize(concurrent = self.class.concurrent)
  @concurrent, @items = concurrent, []
end

Public Instance Methods

add(&block)
Alias for: queue
concurrent=(value) click to toggle source
# File lib/piggly/util/process_queue.rb, line 21
def concurrent=(value)
  @concurrent = value
end
execute() click to toggle source
# File lib/piggly/util/process_queue.rb, line 35
def execute
  # Test if fork is supported
  forkable =
    begin
      Process.wait(Process.fork { exit! 60 })
      raise unless $?.exitstatus.to_i == 60
      true
    rescue Exception
      false
    end

  if forkable
    concurrently
  else
    serially
  end
end
queue(&block) click to toggle source
# File lib/piggly/util/process_queue.rb, line 29
def queue(&block)
  @items << block
end
Also aliased as: add
size() click to toggle source
# File lib/piggly/util/process_queue.rb, line 25
def size
  @items.size
end

Protected Instance Methods

concurrently() click to toggle source
# File lib/piggly/util/process_queue.rb, line 63
def concurrently
  $stderr.puts "ProcessQueue running concurrently"
  active = 0

  # enable enterprise ruby feature
  GC.copy_on_write_friendly = true if GC.respond_to?(:copy_on_write_friendly=)

  while block = @items.shift
    if active >= @concurrent
      pid = Process.wait
      active -= 1
    end

    # use exit! to avoid auto-running any test suites
    Process.fork do
      begin
        block.call
        exit! 0
      rescue Exception
        $stderr.puts $!
        $stderr.puts "\t" + $!.backtrace.join("\n\t")
        exit! 1
      end
    end

    active += 1
  end

  Process.waitall
end
serially() click to toggle source
# File lib/piggly/util/process_queue.rb, line 55
def serially
  $stderr.puts "ProcessQueue running serially"

  while block = @items.shift
    block.call
  end
end