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