Sha256: 6d0eaf172c59ba929965ffdf26afd05ae9dc693799bf6f3760962b5f2dcabb19

Contents?: true

Size: 1.77 KB

Versions: 55

Compression:

Stored size: 1.77 KB

Contents

require 'thread'
begin
  require 'fasttread'
rescue LoadError
end

class ThreadPool
  class Worker
    def initialize(thread_queue)
      @mutex = Mutex.new
      @cv = ConditionVariable.new
      @queue = thread_queue
      @running = true
      @thread = Thread.new do
        @mutex.synchronize do
          while @running
            @cv.wait(@mutex)
            block = get_block
            if block
              @mutex.unlock
              block.call
              @mutex.lock
              reset_block
            end
            @queue << self
          end
        end
      end
    end

    def name
      @thread.inspect
    end

    def get_block
      @block
    end

    def set_block(block)
      @mutex.synchronize do
        raise RuntimeError, "Thread already busy." if @block
        @block = block
        # Signal the thread in this class, that there's a job to be done
        @cv.signal
      end
    end

    def reset_block
      @block = nil
    end

    def busy?
      @mutex.synchronize { !@block.nil? }
    end

    def stop
      @mutex.synchronize do
        @running = false
        @cv.signal
      end
      @thread.join
    end
  end

  attr_accessor :max_size

  def initialize(max_size = 10)
    @max_size = max_size
    @queue = Queue.new
    @workers = []
  end

  def size
    @workers.size
  end

  def busy?
    @queue.size < @workers.size
  end

  def shutdown
    @workers.each { |w| w.stop }
    @workers = []
  end

  alias :join :shutdown

  def process(block=nil,&blk)
    block = blk if block_given?
    worker = get_worker
    worker.set_block(block)
  end

  private

  def get_worker
    if !@queue.empty? or @workers.size == @max_size
      return @queue.pop
    else
      worker = Worker.new(@queue)
      @workers << worker
      worker
    end
  end

end

Version data entries

55 entries across 55 versions & 3 rubygems

Version Path
auser-poolparty-0.2.42 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.44 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.45 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.46 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.47 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.48 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.49 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.50 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.51 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.52 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.53 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.54 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.55 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.56 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.57 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.58 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.59 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.60 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.61 lib/poolparty/modules/thread_pool.rb
auser-poolparty-0.2.62 lib/poolparty/modules/thread_pool.rb