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