class Celluloid::PoolManager - celluloid-0.15.2 Documentation

# class Celluloid::PoolManager

Manages a fixed-size pool of workers Delegates work (i.e. methods) and supervises workers Don't use this class directly. Instead use MyKlass.pool

### Public Class Methods

new(worker_class, options = {}) click to toggle source

    # File lib/celluloid/pool_manager.rb, line 12
    def initialize(worker_class, options = {})
      @size = options[:size] || [Celluloid.cores, 2].max
      raise ArgumentError, "minimum pool size is 2" if @size < 2

      @worker_class = worker_class
      @args = options[:args] ? Array(options[:args]) : []

      @idle = @size.times.map { worker_class.new_link(*@args) }

      # FIXME: Another data structure (e.g. Set) would be more appropriate
      # here except it causes MRI to crash :o
      @busy = []
    end

### Public Instance Methods

__crash_handler__(actor, reason) click to toggle source

Spawn a new worker for every crashed one

    # File lib/celluloid/pool_manager.rb, line 108
    def __crash_handler__(actor, reason)
      @busy.delete actor
      @idle.delete actor
      return unless reason

      @idle << @worker_class.new_link(*@args)
      signal :respawn_complete
    end

__provision_worker__() click to toggle source

Provision a new worker

    # File lib/celluloid/pool_manager.rb, line 93
    def __provision_worker__
      Task.current.guard_warnings = true
      while @idle.empty?
        # Wait for responses from one of the busy workers
        response = exclusive { receive { |msg| msg.is_a?(Response) } }
        Thread.current[:celluloid_actor].handle_message(response)
      end

      worker = @idle.shift
      @busy << worker

      worker
    end

__shutdown__() click to toggle source

    # File lib/celluloid/pool_manager.rb, line 26
    def __shutdown__
      terminators = (@idle + @busy).each do |actor|
        begin
          actor.future(:terminate)
        rescue DeadActorError
        end
      end

      terminators.compact.each { |terminator| terminator.value rescue nil }
    end

_send_(method, *args, &block) click to toggle source

    # File lib/celluloid/pool_manager.rb, line 37
    def _send_(method, *args, &block)
      worker = __provision_worker__

      begin
        worker._send_ method, *args, &block
      rescue DeadActorError # if we get a dead actor out of the pool
        wait :respawn_complete
        worker = __provision_worker__
        retry
      rescue Exception => ex
        abort ex
      ensure
        if worker.alive?
          @idle << worker
          @busy.delete worker
        end
      end
    end

busy_size() click to toggle source

    # File lib/celluloid/pool_manager.rb, line 84
    def busy_size
      @busy.length
    end

idle_size() click to toggle source

    # File lib/celluloid/pool_manager.rb, line 88
    def idle_size
      @idle.length
    end

inspect() click to toggle source

    # File lib/celluloid/pool_manager.rb, line 76
    def inspect
      _send_ :inspect
    end

is_a?(klass) click to toggle source

    # File lib/celluloid/pool_manager.rb, line 60
    def is_a?(klass)
      _send_ :is_a?, klass
    end

kind_of?(klass) click to toggle source

    # File lib/celluloid/pool_manager.rb, line 64
    def kind_of?(klass)
      _send_ :kind_of?, klass
    end

method_missing(method, *args, &block) click to toggle source
Calls superclass method

    # File lib/celluloid/pool_manager.rb, line 121
    def method_missing(method, *args, &block)
      if respond_to?(method)
        _send_ method, *args, &block
      else
        super
      end
    end

methods(include_ancestors = true) click to toggle source

    # File lib/celluloid/pool_manager.rb, line 68
    def methods(include_ancestors = true)
      _send_ :methods, include_ancestors
    end

name() click to toggle source

    # File lib/celluloid/pool_manager.rb, line 56
    def name
      _send_ @mailbox, :name
    end

respond_to?(method, include_private = false) click to toggle source
Calls superclass method

    # File lib/celluloid/pool_manager.rb, line 117
    def respond_to?(method, include_private = false)
      super || @worker_class.instance_methods.include?(method.to_sym)
    end

size() click to toggle source

    # File lib/celluloid/pool_manager.rb, line 80
    def size
      @size
    end

to_s() click to toggle source

    # File lib/celluloid/pool_manager.rb, line 72
    def to_s
      _send_ :to_s
    end