async-pool 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb369c01748a2f2c555a8549a2280c1e39b30a3c7f7918e4e426a79d7eec41ce
4
- data.tar.gz: 5b8d9ac62de382ce06753d04512708cca9c969c7eaf368a1f7b88fa12b6d1eae
3
+ metadata.gz: 958468bc2e159bc6304f603d522ccc08fe967469bd463a992484f237e880ddf3
4
+ data.tar.gz: 2fcd90d3589cb71a9395b0e9b9810dc860bda4971c538e754d7a4113e1628ff0
5
5
  SHA512:
6
- metadata.gz: b18bfe389d25644da07f2e8f85bd92891f7066e1c9b67d6ed91e9a9de1e8d47bcaf4e612c7388619a8693c2f6ee2fc85a09f0cada7647f53a2de5714dbaac30a
7
- data.tar.gz: 0bb8ca350d3942057cfcc91ff957382512ee0e1e012e20344ba71b6bf09df7a353c65d4996341fc8407d99629a8286346a6412a4e6bc6a0199dcaf67e11d069f
6
+ metadata.gz: 5a03eb3421cd11bc52ec995ddadd67c9e717763a69dbed5d8d27248f0b93ec9e824765eef5a8d02719968fc20f974d4b7690ec8a1e66fa6cc5d103f95f56ce0d
7
+ data.tar.gz: f4f19064995d171e013e5d80c90343387c733e9f13a4acd846c1534aee573ff7f75c5d3d41907919bdd83ff09bd1112e6a9d7f063ed66e4e072e91648220ae2b
checksums.yaml.gz.sig CHANGED
Binary file
@@ -5,11 +5,14 @@
5
5
  # Copyright, 2020, by Simon Perepelitsa.
6
6
  # Copyright, 2024, by Thomas Morgan.
7
7
 
8
- require 'console/logger'
8
+ require "console/logger"
9
9
 
10
- require 'async'
11
- require 'async/notification'
12
- require 'async/semaphore'
10
+ require "async"
11
+ require "async/notification"
12
+ require "async/semaphore"
13
+
14
+ require "traces"
15
+ require "metrics"
13
16
 
14
17
  module Async
15
18
  module Pool
@@ -26,7 +29,7 @@ module Async
26
29
  # @parameter limit [Integer | Nil] The maximum number of resources that this pool can have at any given time. If nil, the pool can have an unlimited number of resources.
27
30
  # @parameter concurrency [Integer] The maximum number of concurrent tasks that can be creating a new resource.
28
31
  # @parameter policy [Policy] The pool policy.
29
- def initialize(constructor, limit: nil, concurrency: (limit || 1), policy: nil)
32
+ def initialize(constructor, limit: nil, concurrency: (limit || 1), policy: nil, tags: nil)
30
33
  @constructor = constructor
31
34
  @limit = limit
32
35
 
@@ -36,6 +39,8 @@ module Async
36
39
  @policy = policy
37
40
  @gardener = nil
38
41
 
42
+ @tags = Metrics::Tags.normalize(tags)
43
+
39
44
  # All available resources:
40
45
  @resources = {}
41
46
 
@@ -93,6 +98,9 @@ module Async
93
98
  # @attribute [Hash(Resource, Integer)] all allocated resources, and their associated usage.
94
99
  attr :resources
95
100
 
101
+ # @attribute [Array(String)] The name of the pool.
102
+ attr_accessor :tags
103
+
96
104
  # The number of resources in the pool.
97
105
  def size
98
106
  @resources.size
@@ -154,7 +162,9 @@ module Async
154
162
  retire(resource) unless processed
155
163
  end
156
164
 
157
- private def drain
165
+ def drain
166
+ Console.debug(self, "Draining pool...", size: @resources.size)
167
+
158
168
  # Enumerate all existing resources and retire them:
159
169
  while resource = acquire_existing_resource
160
170
  retire(resource)
@@ -262,6 +272,7 @@ module Async
262
272
 
263
273
  def reuse(resource)
264
274
  Console.debug(self) {"Reuse #{resource}"}
275
+
265
276
  usage = @resources[resource]
266
277
 
267
278
  if usage.nil? || usage.zero?
@@ -286,11 +297,7 @@ module Async
286
297
  @notification.wait
287
298
  end
288
299
 
289
- Console.debug(self) {"Wait for resource -> #{resource}"}
290
-
291
- # if resource.concurrency > 1
292
- # @notification.signal
293
- # end
300
+ # Be careful not to context switch or fail here.
294
301
 
295
302
  return resource
296
303
  end
@@ -318,12 +325,16 @@ module Async
318
325
  def available_resource
319
326
  resource = nil
320
327
 
328
+ Console.debug(self, "Acquiring concurrency guard...", blocking: @guard.blocking?)
329
+
321
330
  @guard.acquire do
331
+ Console.debug(self, "Acquired concurrency guard.")
332
+
322
333
  resource = acquire_or_create_resource
323
334
  end
324
335
 
325
336
  return resource
326
- rescue Exception
337
+ rescue Exception => error
327
338
  reuse(resource) if resource
328
339
  raise
329
340
  end
@@ -375,6 +386,52 @@ module Async
375
386
  return create_resource
376
387
  end
377
388
  end
389
+
390
+ Traces::Provider(self) do
391
+ def create_resource(...)
392
+ attributes = {
393
+ concurrency: @guard.limit,
394
+ size: @resources.size,
395
+ limit: @limit,
396
+ tags: @tags,
397
+ }
398
+
399
+ Traces.trace("async.pool.create", attributes: attributes) {super}
400
+ end
401
+
402
+ def drain(...)
403
+ attributes = {
404
+ size: @resources.size,
405
+ tags: @tags,
406
+ }
407
+
408
+ Traces.trace("async.pool.drain", attributes: attributes) {super}
409
+ end
410
+ end
411
+
412
+ Metrics::Provider(self) do
413
+ ACQUIRE_COUNT = Metrics.metric("async.pool.acquire", :counter, description: "Number of times a resource was invoked.")
414
+ RELEASE_COUNT = Metrics.metric("async.pool.release", :counter, description: "Number of times a resource was released.")
415
+ RETIRE_COUNT = Metrics.metric("async.pool.retire", :counter, description: "Number of times a resource was retired.")
416
+
417
+ def acquire(...)
418
+ ACQUIRE_COUNT.emit(1, tags: @tags)
419
+
420
+ super
421
+ end
422
+
423
+ def release(...)
424
+ super.tap do
425
+ RELEASE_COUNT.emit(1, tags: @tags)
426
+ end
427
+ end
428
+
429
+ def retire(...)
430
+ super.tap do
431
+ RETIRE_COUNT.emit(1, tags: @tags)
432
+ end
433
+ end
434
+ end
378
435
  end
379
436
  end
380
437
  end
@@ -3,10 +3,10 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require 'console/logger'
6
+ require "console/logger"
7
7
 
8
- require 'async/notification'
9
- require 'async/semaphore'
8
+ require "async/notification"
9
+ require "async/semaphore"
10
10
 
11
11
  module Async
12
12
  module Pool
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module Pool
8
- VERSION = "0.8.0"
8
+ VERSION = "0.9.0"
9
9
  end
10
10
  end
data/lib/async/pool.rb CHANGED
@@ -3,8 +3,8 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require_relative 'pool/version'
7
- require_relative 'pool/controller'
6
+ require_relative "pool/version"
7
+ require_relative "pool/controller"
8
8
 
9
9
  # @namespace
10
10
  module Async
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.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -40,7 +40,7 @@ cert_chain:
40
40
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
41
41
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
42
42
  -----END CERTIFICATE-----
43
- date: 2024-08-07 00:00:00.000000000 Z
43
+ date: 2024-10-12 00:00:00.000000000 Z
44
44
  dependencies:
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: async
@@ -56,6 +56,34 @@ dependencies:
56
56
  - - ">="
57
57
  - !ruby/object:Gem::Version
58
58
  version: '1.25'
59
+ - !ruby/object:Gem::Dependency
60
+ name: metrics
61
+ requirement: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - "~>"
64
+ - !ruby/object:Gem::Version
65
+ version: '0.11'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - "~>"
71
+ - !ruby/object:Gem::Version
72
+ version: '0.11'
73
+ - !ruby/object:Gem::Dependency
74
+ name: traces
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
59
87
  description:
60
88
  email:
61
89
  executables: []
metadata.gz.sig CHANGED
Binary file