class SilentWorker

Constants

FINISH_DATA
VERSION

Attributes

job[R]
queue[R]
workers[R]

Public Class Methods

new(workers = 8, &job) click to toggle source
# File lib/silent_worker.rb, line 9
def initialize(workers = 8, &job)
  @job = job
  @workers = workers
  @threads = []
  @queue = Queue.new
  setup_signal_traps
  start
end

Public Instance Methods

<<(data) click to toggle source
# File lib/silent_worker.rb, line 18
def <<(data)
  @queue.enq(data)
end
abort() click to toggle source
# File lib/silent_worker.rb, line 27
def abort
  @threads.each(&:kill)
  wait
end
Also aliased as: stop!
start() click to toggle source
# File lib/silent_worker.rb, line 37
def start
  return if @working

  @working = true
  @finished = false
  @workers.times do |n|
    @threads << Thread.start(@job, @queue, n) do |job, queue, n|
      Thread.current[:num] = n
      loop do
        data = queue.deq
        break if @finished && data == FINISH_DATA
        job.call(data)
      end
    end
  end
end
stop() click to toggle source
# File lib/silent_worker.rb, line 33
def stop
  finish!
end
stop!()
Alias for: abort
wait() click to toggle source
# File lib/silent_worker.rb, line 22
def wait
  finish!
  @threads.find_all(&:alive?).each(&:join)
end

Private Instance Methods

finish!() click to toggle source
# File lib/silent_worker.rb, line 56
def finish!
  @working = false

  unless @finished
    @finished = true
    @workers.times do
      @queue.enq(FINISH_DATA)
    end
  end
end
setup_signal_traps() click to toggle source
# File lib/silent_worker.rb, line 67
def setup_signal_traps
  Signal.trap("INT") { abort }
  Signal.trap("TERM") { abort }
  Signal.trap("QUIT") { abort }

  # Maybe forgotten to call #wait
  Signal.trap("EXIT") do
    return if @finished
    warn "\nWARNING: You should call SilentWorker#wait to wait jobs are completed. Now abort them.\n"
    abort
  end
end