Class: Async::HTTP::Pool
- Inherits:
-
Object
- Object
- Async::HTTP::Pool
- Defined in:
- lib/async/http/pool.rb
Overview
Pool behaviours
-
Single request per connection (HTTP/1 without keep-alive)
-
Multiple sequential requests per connection (HTTP1 with keep-alive)
-
Multiplex requests per connection (HTTP2)
In general we don’t know the policy until connection is established.
This pool doesn’t impose a maximum number of open resources, but it WILL block if there are no available resources and trying to allocate another one fails.
Resources must respond to #multiplex -> 1 or more. #reusable? -> can be used again.
Instance Attribute Summary collapse
-
#resources ⇒ Object
readonly
All allocated resources.
Instance Method Summary collapse
- #acquire ⇒ Object
-
#active ⇒ Object
The number of allocated resources.
-
#busy? ⇒ Boolean
Whether there are resources which are currently in use.
- #close ⇒ Object
- #empty? ⇒ Boolean
-
#initialize(limit = nil, &block) ⇒ Pool
constructor
A new instance of Pool.
-
#release(resource) ⇒ Object
Make the resource resources and let waiting tasks know that there is something resources.
- #to_s ⇒ Object
-
#wait ⇒ Object
Wait until a pool resource has been freed.
Constructor Details
#initialize(limit = nil, &block) ⇒ Pool
Returns a new instance of Pool.
43 44 45 46 47 48 49 50 51 |
# File 'lib/async/http/pool.rb', line 43 def initialize(limit = nil, &block) @resources = {} # resource => count @available = Async::Notification.new @limit = limit @constructor = block @guard = Async::Semaphore.new(1) end |
Instance Attribute Details
#resources ⇒ Object (readonly)
All allocated resources.
73 74 75 |
# File 'lib/async/http/pool.rb', line 73 def resources @resources end |
Instance Method Details
#acquire ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/async/http/pool.rb', line 79 def acquire resource = wait_for_resource return resource unless block_given? begin yield resource ensure release(resource) end end |
#active ⇒ Object
The number of allocated resources.
54 55 56 |
# File 'lib/async/http/pool.rb', line 54 def active @resources.count end |
#busy? ⇒ Boolean
Whether there are resources which are currently in use.
59 60 61 62 63 64 65 |
# File 'lib/async/http/pool.rb', line 59 def busy? @resources.collect do |_, usage| return true if usage > 0 end return false end |
#close ⇒ Object
101 102 103 104 |
# File 'lib/async/http/pool.rb', line 101 def close @resources.each_key(&:close) @resources.clear end |
#empty? ⇒ Boolean
75 76 77 |
# File 'lib/async/http/pool.rb', line 75 def empty? @resources.empty? end |
#release(resource) ⇒ Object
Make the resource resources and let waiting tasks know that there is something resources.
92 93 94 95 96 97 98 99 |
# File 'lib/async/http/pool.rb', line 92 def release(resource) # A resource that is not good should also not be reusable. if resource.reusable? reuse(resource) else retire(resource) end end |
#to_s ⇒ Object
106 107 108 |
# File 'lib/async/http/pool.rb', line 106 def to_s "\#<#{self.class} resources=#{availability_string} limit=#{@limit.inspect}>" end |
#wait ⇒ Object
Wait until a pool resource has been freed.
68 69 70 |
# File 'lib/async/http/pool.rb', line 68 def wait @available.wait end |