async-limiter 1.5.4 → 2.0.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/context/generic-limiter.md +167 -0
  4. data/context/getting-started.md +226 -0
  5. data/context/index.yaml +41 -0
  6. data/context/limited-limiter.md +184 -0
  7. data/context/queued-limiter.md +109 -0
  8. data/context/timing-strategies.md +666 -0
  9. data/context/token-usage.md +85 -0
  10. data/lib/async/limiter/generic.rb +160 -0
  11. data/lib/async/limiter/limited.rb +103 -0
  12. data/lib/async/limiter/queued.rb +85 -0
  13. data/lib/async/limiter/timing/burst.rb +153 -0
  14. data/lib/async/limiter/timing/fixed_window.rb +42 -0
  15. data/lib/async/limiter/timing/leaky_bucket.rb +146 -0
  16. data/lib/async/limiter/timing/none.rb +56 -0
  17. data/lib/async/limiter/timing/ordered.rb +58 -0
  18. data/lib/async/limiter/timing/sliding_window.rb +152 -0
  19. data/lib/async/limiter/token.rb +102 -0
  20. data/lib/async/limiter/version.rb +10 -3
  21. data/lib/async/limiter.rb +21 -7
  22. data/lib/metrics/provider/async/limiter/generic.rb +74 -0
  23. data/lib/metrics/provider/async/limiter.rb +7 -0
  24. data/lib/traces/provider/async/limiter/generic.rb +41 -0
  25. data/lib/traces/provider/async/limiter.rb +7 -0
  26. data/license.md +25 -0
  27. data/readme.md +45 -0
  28. data/releases.md +50 -0
  29. data.tar.gz.sig +0 -0
  30. metadata +68 -83
  31. metadata.gz.sig +0 -0
  32. data/lib/async/limiter/concurrent.rb +0 -101
  33. data/lib/async/limiter/constants.rb +0 -6
  34. data/lib/async/limiter/unlimited.rb +0 -53
  35. data/lib/async/limiter/window/continuous.rb +0 -21
  36. data/lib/async/limiter/window/fixed.rb +0 -21
  37. data/lib/async/limiter/window/sliding.rb +0 -21
  38. data/lib/async/limiter/window.rb +0 -296
@@ -0,0 +1,109 @@
1
+ # Queued Limiter
2
+
3
+ This guide explains the {ruby Async::Limiter::Queued} class, which provides priority-based task scheduling with optional resource management. Its key feature is priority-based acquisition where higher priority tasks get access first, with optional support for distributing specific resources from a pre-populated queue.
4
+
5
+ ## Usage
6
+
7
+ Use a queue of specific resources that tasks can acquire:
8
+
9
+ ```ruby
10
+ require "async"
11
+ require "async/limiter"
12
+ require "async/queue"
13
+
14
+ Async do
15
+ # Pre-populate queue with database connections
16
+ queue = Async::Queue.new
17
+ queue.push("connection_1")
18
+ queue.push("connection_2")
19
+ queue.push("connection_3")
20
+
21
+ limiter = Async::Limiter::Queued.new(queue)
22
+
23
+ 5.times do |i|
24
+ limiter.async do |task|
25
+ # Automatically gets an available connection
26
+ limiter.acquire do |connection|
27
+ puts "Task #{i} using #{connection}"
28
+ task.sleep 1
29
+ # Connection automatically returned to queue
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ # Output shows tasks sharing the 3 available connections
36
+ # Tasks 3,4 wait for connections to be returned
37
+ ```
38
+
39
+ ### Manual Resource Management
40
+
41
+ For fine-grained control over resource lifecycle:
42
+
43
+ ```ruby
44
+ queue = Async::Queue.new
45
+ 3.times { |i| queue.push("resource_#{i}") }
46
+
47
+ limiter = Async::Limiter::Queued.new(queue)
48
+
49
+ # Acquire with automatic return
50
+ limiter.acquire do |resource|
51
+ puts "Using #{resource}"
52
+ # Resource automatically returned when block exits
53
+ end
54
+
55
+ # Manual acquire/release pattern
56
+ resource = limiter.acquire
57
+ begin
58
+ puts "Using #{resource}"
59
+ # Do work with resource
60
+ ensure
61
+ limiter.release(resource)
62
+ end
63
+ ```
64
+
65
+ ## Priority-Based Resource Allocation
66
+
67
+ Tasks with higher priority values get resources first:
68
+
69
+ ```ruby
70
+ Async do
71
+ queue = Async::PriorityQueue.new
72
+ limiter = Async::Limiter::Queued.new(queue)
73
+ results = []
74
+
75
+ # Start tasks with different priorities
76
+ tasks = [
77
+ Async do
78
+ result = limiter.acquire(priority: 1, timeout: 1.0) do |worker|
79
+ "Low priority task used #{worker}"
80
+ end
81
+ results << result
82
+ end,
83
+
84
+ Async do
85
+ result = limiter.acquire(priority: 10, timeout: 1.0) do |worker|
86
+ "High priority task used #{worker}"
87
+ end
88
+ results << result
89
+ end,
90
+
91
+ Async do
92
+ result = limiter.acquire(priority: 5, timeout: 1.0) do |worker|
93
+ "Medium priority task used #{worker}"
94
+ end
95
+ results << result
96
+ end
97
+ ]
98
+
99
+ # Add some "workers":
100
+ 2.times do |i|
101
+ limiter.release("worker_#{i}")
102
+ end
103
+
104
+ tasks.each(&:wait)
105
+
106
+ puts results
107
+ # High priority task gets resource first, then medium, then low.
108
+ end
109
+ ```