Class: BlackCompany::Pool

Inherits:
Object
  • Object
show all
Defined in:
lib/black_company/pool.rb

Constant Summary collapse

DEFAULT_POOL_SIZE =
20

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(pool_size: DEFAULT_POOL_SIZE, queue_size: nil, workhorse_class: Workhorse, exeption_handlers: []) ⇒ Pool

Returns a new instance of Pool.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/black_company/pool.rb', line 11

def initialize(
  pool_size: DEFAULT_POOL_SIZE,
  queue_size: nil,
  workhorse_class: Workhorse,
  exeption_handlers: []
)

  @queue = queue_size ? SizedQueue.new(queue_size) : Queue.new
  @fired_queue = Queue.new
  @workhorse_class = workhorse_class
  @exeption_handlers = exeption_handlers

  @workhorses = []
  hire(pool_size)
end

Instance Attribute Details

#exeption_handlersObject (readonly)

Returns the value of attribute exeption_handlers.



9
10
11
# File 'lib/black_company/pool.rb', line 9

def exeption_handlers
  @exeption_handlers
end

#workhorse_classObject (readonly)

Returns the value of attribute workhorse_class.



9
10
11
# File 'lib/black_company/pool.rb', line 9

def workhorse_class
  @workhorse_class
end

Instance Method Details

#countObject Also known as: size



27
28
29
# File 'lib/black_company/pool.rb', line 27

def count
  @workhorses.count
end

#fire(count) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/black_company/pool.rb', line 32

def fire(count)
  count.times { @queue.push(Event.new(:terminate, @fired_queue)) }
  fired_count = 0
  while fired_count != count
    workhorse = @fired_queue.pop
    workhorse.join
    @workhorses.delete(workhorse)
    fired_count += 1
  end

  true
end

#hire(count) ⇒ Object



45
46
47
48
49
50
# File 'lib/black_company/pool.rb', line 45

def hire(count)
  workhorses = Array.new(count) { hire_one }
  @workhorses.concat(workhorses)

  true
end

#inspectObject



52
53
54
55
56
57
# File 'lib/black_company/pool.rb', line 52

def inspect
  "#<#{self.class}:0x%014x " \
    "@count=#{count} " \
    "@workhorse_class=#{workhorse_class} " \
    "@queued_tasks_size=#{queued_tasks_size}>" % [object_id]
end

#on_exeption(&block) ⇒ Object



59
60
61
62
63
64
# File 'lib/black_company/pool.rb', line 59

def on_exeption(&block)
  @exeption_handlers << block
  @workhorses.each { |w| w.on_exeption(&block) }

  true
end

#queued_tasks_sizeObject



70
71
72
# File 'lib/black_company/pool.rb', line 70

def queued_tasks_size
  @queue.size
end

#quitObject



74
75
76
# File 'lib/black_company/pool.rb', line 74

def quit
  fire(count)
end

#receive(task_content = nil, &block) ⇒ Object



66
67
68
# File 'lib/black_company/pool.rb', line 66

def receive(task_content = nil, &block)
  @queue.push(Event.new(:perform, Task.new(task_content, &block)))
end