Class: Puma::ThreadPool

Inherits:
Object
  • Object
show all
Defined in:
lib/puma/thread_pool.rb

Overview

A simple thread pool management object.

Defined Under Namespace

Classes: AutoTrim

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(min, max, *extra, &blk) ⇒ ThreadPool

Maintain a minimum of min and maximum of max threads in the pool.

The block passed is the work that will be performed in each thread.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/puma/thread_pool.rb', line 14

def initialize(min, max, *extra, &blk)
  @cond = ConditionVariable.new
  @mutex = Mutex.new

  @todo = []

  @spawned = 0
  @waiting = 0

  @min = min
  @max = max
  @block = blk
  @extra = extra

  @shutdown = false

  @trim_requested = 0

  @workers = []

  @auto_trim = nil

  @mutex.synchronize do
    min.times { spawn_thread }
  end
end

Instance Attribute Details

#spawnedObject (readonly)

Returns the value of attribute spawned.



41
42
43
# File 'lib/puma/thread_pool.rb', line 41

def spawned
  @spawned
end

#trim_requestedObject (readonly)

Returns the value of attribute trim_requested.



41
42
43
# File 'lib/puma/thread_pool.rb', line 41

def trim_requested
  @trim_requested
end

Instance Method Details

#<<(work) ⇒ Object

Add work to the todo list for a Thread to pickup and process.



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/puma/thread_pool.rb', line 109

def <<(work)
  @mutex.synchronize do
    if @shutdown
      raise "Unable to add work while shutting down"
    end

    @todo << work

    if @waiting == 0 and @spawned < @max
      spawn_thread
    end

    @cond.signal
  end
end

#auto_trim!(timeout = 5) ⇒ Object



162
163
164
165
# File 'lib/puma/thread_pool.rb', line 162

def auto_trim!(timeout=5)
  @auto_trim = AutoTrim.new(self, timeout)
  @auto_trim.start!
end

#backlogObject

How many objects have yet to be processed by the pool?



45
46
47
# File 'lib/puma/thread_pool.rb', line 45

def backlog
  @mutex.synchronize { @todo.size }
end

#shutdownObject

Tell all threads in the pool to exit and wait for them to finish.



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/puma/thread_pool.rb', line 169

def shutdown
  @mutex.synchronize do
    @shutdown = true
    @cond.broadcast

    @auto_trim.stop if @auto_trim
  end

  # Use this instead of #each so that we don't stop in the middle
  # of each and see a mutated object mid #each
  @workers.first.join until @workers.empty?

  @spawned = 0
  @workers = []
end

#trim(force = false) ⇒ Object

If too many threads are in the pool, tell one to finish go ahead and exit. If force is true, then a trim request is requested even if all threads are being utilized.



129
130
131
132
133
134
135
136
# File 'lib/puma/thread_pool.rb', line 129

def trim(force=false)
  @mutex.synchronize do
    if (force or @waiting > 0) and @spawned - @trim_requested > @min
      @trim_requested += 1
      @cond.signal
    end
  end
end