From 01ee5327c018f64fa4b6aa767c0328c56f699170 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 14 May 2010 15:52:58 -0700 Subject: add Rainbows::QueuePool helper It'll be useful later on for a variety of things! --- lib/rainbows/queue_pool.rb | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 lib/rainbows/queue_pool.rb (limited to 'lib/rainbows/queue_pool.rb') diff --git a/lib/rainbows/queue_pool.rb b/lib/rainbows/queue_pool.rb new file mode 100644 index 0000000..806bbee --- /dev/null +++ b/lib/rainbows/queue_pool.rb @@ -0,0 +1,32 @@ +# -*- encoding: binary -*- +require 'thread' + +module Rainbows + + # Thread pool class based on pulling off a single Ruby Queue. + # This is NOT used for the ThreadPool class, since that class does not + # need a userspace Queue. + class QueuePool < Struct.new(:queue, :threads) + G = Rainbows::G + + def initialize(size = 20, &block) + q = Queue.new + self.threads = (1..size).map do + Thread.new do + while job = q.shift + block.call(job) + end + end + end + self.queue = q + end + + def quit! + threads.each { |_| queue << nil } + threads.delete_if do |t| + G.tick + t.alive? ? t.join(0.01) : true + end until threads.empty? + end + end +end -- cgit v1.2.3-24-ge0c7