async-pool 0.3.4 → 0.3.8
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
- data/lib/async/pool/controller.rb +44 -29
- data/lib/async/pool/resource.rb +1 -1
- data/lib/async/pool/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc9d27508f2aedf6acd28b377ecedf2a05a1b8d18441aa523e5ddcdb1f3a726b
|
4
|
+
data.tar.gz: b18617893727bbe6d2a90adaafdcc7e92d8847c4ecb3a7caa519e183a7439be7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39fe6f2c7f4eae7c215c779c1989814fb6f7126aaa6963ec8ee2c73f3f20132b4a985de53819a064f2fab5813a25131bf907c72e0b13758f24a17b6543a01072
|
7
|
+
data.tar.gz: e7f584de1b1bea95655e00b76b167268d74ae54f76e15a6bee614513575f7d3f7e108bade126a8c2c598a4fd8bde8857a8d26481842ef5eac5b00551d9550f07
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
-
require '
|
21
|
+
require 'console/logger'
|
22
22
|
|
23
23
|
require 'async'
|
24
24
|
require 'async/notification'
|
@@ -98,15 +98,19 @@ module Async
|
|
98
98
|
|
99
99
|
# Make the resource resources and let waiting tasks know that there is something resources.
|
100
100
|
def release(resource)
|
101
|
+
reused = false
|
102
|
+
|
101
103
|
# A resource that is not good should also not be reusable.
|
102
104
|
if resource.reusable?
|
103
|
-
reuse(resource)
|
104
|
-
else
|
105
|
-
retire(resource)
|
105
|
+
reused = reuse(resource)
|
106
106
|
end
|
107
|
+
ensure
|
108
|
+
retire(resource) unless reused
|
107
109
|
end
|
108
110
|
|
109
111
|
def close
|
112
|
+
@available.clear
|
113
|
+
|
110
114
|
@resources.each_key(&:close)
|
111
115
|
@resources.clear
|
112
116
|
|
@@ -155,7 +159,7 @@ module Async
|
|
155
159
|
end
|
156
160
|
|
157
161
|
def retire(resource)
|
158
|
-
|
162
|
+
Console.logger.debug(self) {"Retire #{resource}"}
|
159
163
|
|
160
164
|
@resources.delete(resource)
|
161
165
|
|
@@ -169,7 +173,7 @@ module Async
|
|
169
173
|
def start_gardener
|
170
174
|
return if @gardener
|
171
175
|
|
172
|
-
Async(transient: true) do |task|
|
176
|
+
Async(transient: true, annotation: "#{self.class} Gardener") do |task|
|
173
177
|
@gardener = task
|
174
178
|
|
175
179
|
Task.yield
|
@@ -205,7 +209,7 @@ module Async
|
|
205
209
|
end
|
206
210
|
|
207
211
|
def reuse(resource)
|
208
|
-
|
212
|
+
Console.logger.debug(self) {"Reuse #{resource}"}
|
209
213
|
usage = @resources[resource]
|
210
214
|
|
211
215
|
if usage.zero?
|
@@ -227,6 +231,8 @@ module Async
|
|
227
231
|
@resources[resource] = usage - 1
|
228
232
|
|
229
233
|
@notification.signal
|
234
|
+
|
235
|
+
return true
|
230
236
|
end
|
231
237
|
|
232
238
|
def wait_for_resource
|
@@ -235,7 +241,7 @@ module Async
|
|
235
241
|
@notification.wait
|
236
242
|
end
|
237
243
|
|
238
|
-
|
244
|
+
Console.logger.debug(self) {"Wait for resource -> #{resource}"}
|
239
245
|
|
240
246
|
# if resource.concurrency > 1
|
241
247
|
# @notification.signal
|
@@ -263,36 +269,45 @@ module Async
|
|
263
269
|
|
264
270
|
# @returns [Object] An existing resource in a "used" state.
|
265
271
|
def available_resource
|
272
|
+
resource = nil
|
273
|
+
|
266
274
|
@guard.acquire do
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
275
|
+
resource = get_resource
|
276
|
+
end
|
277
|
+
|
278
|
+
return resource
|
279
|
+
rescue Exception
|
280
|
+
reuse(resource) if resource
|
281
|
+
raise
|
282
|
+
end
|
283
|
+
|
284
|
+
private def get_resource
|
285
|
+
while resource = @available.last
|
286
|
+
if usage = @resources[resource] and usage < resource.concurrency
|
287
|
+
if resource.viable?
|
288
|
+
usage = (@resources[resource] += 1)
|
289
|
+
|
290
|
+
if usage == resource.concurrency
|
291
|
+
# The resource is used up to it's limit:
|
280
292
|
@available.pop
|
281
293
|
end
|
294
|
+
|
295
|
+
return resource
|
282
296
|
else
|
283
|
-
|
297
|
+
retire(resource)
|
284
298
|
@available.pop
|
285
299
|
end
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
Async.logger.debug(self) {"No available resources, allocating new one..."}
|
290
|
-
|
291
|
-
return create_resource
|
300
|
+
else
|
301
|
+
# The resource has been removed already, so skip it and remove it from the availability list.
|
302
|
+
@available.pop
|
292
303
|
end
|
293
304
|
end
|
294
305
|
|
295
|
-
|
306
|
+
if @limit.nil? or @resources.size < @limit
|
307
|
+
Console.logger.debug(self) {"No available resources, allocating new one..."}
|
308
|
+
|
309
|
+
return create_resource
|
310
|
+
end
|
296
311
|
end
|
297
312
|
end
|
298
313
|
end
|
data/lib/async/pool/resource.rb
CHANGED
data/lib/async/pool/version.rb
CHANGED
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async-pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.25'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.25'
|
27
27
|
- !ruby/object:Gem::Dependency
|
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
140
|
requirements: []
|
141
|
-
rubygems_version: 3.
|
141
|
+
rubygems_version: 3.2.22
|
142
142
|
signing_key:
|
143
143
|
specification_version: 4
|
144
144
|
summary: A singleplex and multiplex resource pool for implementing robust clients.
|