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
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