Class | Merb::Worker |
In: |
merb-core/lib/merb-core/dispatch/worker.rb
|
Parent: | Object |
thread | [RW] | :api: private |
Creates a new worker thread that loops over the work queue.
:api: private
# File merb-core/lib/merb-core/dispatch/worker.rb, line 29 29: def initialize 30: @thread = Thread.new do 31: loop do 32: process_queue 33: break if Merb::Dispatcher.work_queue.empty? && Merb.exiting 34: end 35: end 36: end
Merb::Worker: | instance of a worker. |
:api: private
# File merb-core/lib/merb-core/dispatch/worker.rb, line 12 12: def start 13: @worker ||= new 14: Merb.at_exit do 15: if Merb::Dispatcher.work_queue.empty? 16: @worker.thread.abort_on_exception = false 17: @worker.thread.raise 18: else 19: @worker.thread.join 20: end 21: end 22: @worker 23: end
Processes tasks in the Merb::Dispatcher.work_queue.
:api: private
# File merb-core/lib/merb-core/dispatch/worker.rb, line 41 41: def process_queue 42: begin 43: while blk = Merb::Dispatcher.work_queue.pop 44: # we've been blocking on the queue waiting for an item sleeping. 45: # when someone pushes an item it wakes up this thread so we 46: # immediately pass execution to the scheduler so we don't 47: # accidentally run this block before the action finishes 48: # it's own processing 49: Thread.pass 50: blk.call 51: break if Merb::Dispatcher.work_queue.empty? && Merb.exiting 52: end 53: rescue Exception => e 54: Merb.logger.warn! %Q!Worker Thread Crashed with Exception:\n#{Merb.exception(e)}\nRestarting Worker Thread! 55: retry 56: end 57: end