async-pool 0.3.12 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/async/pool/controller.rb +53 -26
- data/lib/async/pool/version.rb +1 -1
- data/license.md +1 -1
- data.tar.gz.sig +0 -0
- metadata +5 -5
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90ad67ae4201f83d1a5c9767b425ce1223d0b4d9c068a1046c98948875ec4c15
|
4
|
+
data.tar.gz: 84b8d54ad04302b935f65ca5e13c5929bda43bcf95754db9568f4c99ae7d5e92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3871fcd341afbc5db9af1f6e70ff6b58aeca070f9f8e89a5c4680e20feb33baa4c5d4c946bf2378fc526fa2dc021648ba0ec2b34b08a0de6cf2205ea6065b88f
|
7
|
+
data.tar.gz: 32f66fb6d31ab5413dd104061fd0afc8b3fdfb07d1644a3d315ac40c469cb985d976da393e9b54fb13fd6fff5b5a2680f7c0f00a506c52c735a068e074f890d1
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
@@ -17,7 +17,16 @@ module Async
|
|
17
17
|
self.new(block, **options)
|
18
18
|
end
|
19
19
|
|
20
|
-
def initialize(constructor, limit: nil, concurrency: nil)
|
20
|
+
def initialize(constructor, limit: nil, concurrency: (limit || 1), policy: nil)
|
21
|
+
@constructor = constructor
|
22
|
+
@limit = limit
|
23
|
+
|
24
|
+
# This semaphore is used to limit the number of concurrent tasks which are creating new resources.
|
25
|
+
@guard = Async::Semaphore.new(concurrency)
|
26
|
+
|
27
|
+
@policy = policy
|
28
|
+
@gardener = nil
|
29
|
+
|
21
30
|
# All available resources:
|
22
31
|
@resources = {}
|
23
32
|
|
@@ -25,24 +34,28 @@ module Async
|
|
25
34
|
# This list may contain false positives, or resources which were okay but have since entered a state which is unusuable.
|
26
35
|
@available = []
|
27
36
|
|
37
|
+
# Used to signal when a resource has been released:
|
28
38
|
@notification = Async::Notification.new
|
29
|
-
|
30
|
-
@limit = limit
|
31
|
-
|
32
|
-
@constructor = constructor
|
33
|
-
|
34
|
-
# Set the concurrency to be the same as the limit for maximum performance:
|
35
|
-
if limit
|
36
|
-
concurrency ||= limit
|
37
|
-
else
|
38
|
-
concurrency ||= 1
|
39
|
-
end
|
40
|
-
|
41
|
-
@guard = Async::Semaphore.new(concurrency)
|
42
|
-
|
43
|
-
@gardener = nil
|
44
39
|
end
|
45
40
|
|
41
|
+
# @attribute [Proc] The constructor used to create new resources.
|
42
|
+
attr :constructor
|
43
|
+
|
44
|
+
# @attribute [Integer] The maximum number of resources that this pool can have at any given time.
|
45
|
+
attr_accessor :limit
|
46
|
+
|
47
|
+
# @attribute [Integer] The maximum number of concurrent tasks that can be creating a new resource.
|
48
|
+
def concurrency
|
49
|
+
@guard.limit
|
50
|
+
end
|
51
|
+
|
52
|
+
def concurrency= value
|
53
|
+
@guard.limit = value
|
54
|
+
end
|
55
|
+
|
56
|
+
# @attribute [Policy] The pool policy.
|
57
|
+
attr_accessor :policy
|
58
|
+
|
46
59
|
# @attribute [Hash(Resource, Integer)] all allocated resources, and their associated usage.
|
47
60
|
attr :resources
|
48
61
|
|
@@ -98,6 +111,8 @@ module Async
|
|
98
111
|
if resource.reusable?
|
99
112
|
processed = reuse(resource)
|
100
113
|
end
|
114
|
+
|
115
|
+
# @policy.released(self, resource)
|
101
116
|
ensure
|
102
117
|
retire(resource) unless processed
|
103
118
|
end
|
@@ -181,7 +196,15 @@ module Async
|
|
181
196
|
Async(transient: true, annotation: "#{self.class} Gardener") do |task|
|
182
197
|
@gardener = task
|
183
198
|
|
184
|
-
|
199
|
+
while true
|
200
|
+
if @policy
|
201
|
+
@policy.call(self)
|
202
|
+
else
|
203
|
+
Task.yield
|
204
|
+
end
|
205
|
+
|
206
|
+
self.wait
|
207
|
+
end
|
185
208
|
ensure
|
186
209
|
@gardener = nil
|
187
210
|
self.close
|
@@ -193,18 +216,18 @@ module Async
|
|
193
216
|
end
|
194
217
|
|
195
218
|
def availability_string
|
196
|
-
@resources.collect do |resource,usage|
|
219
|
+
@resources.collect do |resource, usage|
|
197
220
|
"#{usage}/#{resource.concurrency}#{resource.viable? ? nil : '*'}/#{resource.count}"
|
198
221
|
end.join(";")
|
199
222
|
end
|
200
223
|
|
201
|
-
def usage
|
202
|
-
|
203
|
-
end
|
204
|
-
|
205
|
-
def free
|
206
|
-
|
207
|
-
end
|
224
|
+
# def usage
|
225
|
+
# @resources.count{|resource, usage| usage > 0}
|
226
|
+
# end
|
227
|
+
#
|
228
|
+
# def free
|
229
|
+
# @resources.count{|resource, usage| usage == 0}
|
230
|
+
# end
|
208
231
|
|
209
232
|
def reuse(resource)
|
210
233
|
Console.logger.debug(self) {"Reuse #{resource}"}
|
@@ -255,6 +278,8 @@ module Async
|
|
255
278
|
end
|
256
279
|
end
|
257
280
|
|
281
|
+
# @policy.created(self, resource)
|
282
|
+
|
258
283
|
return resource
|
259
284
|
end
|
260
285
|
|
@@ -272,7 +297,9 @@ module Async
|
|
272
297
|
raise
|
273
298
|
end
|
274
299
|
|
275
|
-
private
|
300
|
+
private
|
301
|
+
|
302
|
+
def get_resource
|
276
303
|
while resource = @available.last
|
277
304
|
if usage = @resources[resource] and usage < resource.concurrency
|
278
305
|
if resource.viable?
|
data/lib/async/pool/version.rb
CHANGED
data/license.md
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async-pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
@@ -39,7 +39,7 @@ cert_chain:
|
|
39
39
|
Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
|
40
40
|
voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
|
41
41
|
-----END CERTIFICATE-----
|
42
|
-
date:
|
42
|
+
date: 2023-03-12 00:00:00.000000000 Z
|
43
43
|
dependencies:
|
44
44
|
- !ruby/object:Gem::Dependency
|
45
45
|
name: async
|
@@ -117,14 +117,14 @@ dependencies:
|
|
117
117
|
requirements:
|
118
118
|
- - "~>"
|
119
119
|
- !ruby/object:Gem::Version
|
120
|
-
version: '0.
|
120
|
+
version: '0.15'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
123
|
version_requirements: !ruby/object:Gem::Requirement
|
124
124
|
requirements:
|
125
125
|
- - "~>"
|
126
126
|
- !ruby/object:Gem::Version
|
127
|
-
version: '0.
|
127
|
+
version: '0.15'
|
128
128
|
- !ruby/object:Gem::Dependency
|
129
129
|
name: sus-fixtures-async
|
130
130
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
171
|
- !ruby/object:Gem::Version
|
172
172
|
version: '0'
|
173
173
|
requirements: []
|
174
|
-
rubygems_version: 3.
|
174
|
+
rubygems_version: 3.4.7
|
175
175
|
signing_key:
|
176
176
|
specification_version: 4
|
177
177
|
summary: A singleplex and multiplex resource pool for implementing robust clients.
|
metadata.gz.sig
CHANGED
Binary file
|