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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/context/generic-limiter.md +167 -0
- data/context/getting-started.md +226 -0
- data/context/index.yaml +41 -0
- data/context/limited-limiter.md +184 -0
- data/context/queued-limiter.md +109 -0
- data/context/timing-strategies.md +666 -0
- data/context/token-usage.md +85 -0
- data/lib/async/limiter/generic.rb +160 -0
- data/lib/async/limiter/limited.rb +103 -0
- data/lib/async/limiter/queued.rb +85 -0
- data/lib/async/limiter/timing/burst.rb +153 -0
- data/lib/async/limiter/timing/fixed_window.rb +42 -0
- data/lib/async/limiter/timing/leaky_bucket.rb +146 -0
- data/lib/async/limiter/timing/none.rb +56 -0
- data/lib/async/limiter/timing/ordered.rb +58 -0
- data/lib/async/limiter/timing/sliding_window.rb +152 -0
- data/lib/async/limiter/token.rb +102 -0
- data/lib/async/limiter/version.rb +10 -3
- data/lib/async/limiter.rb +21 -7
- data/lib/metrics/provider/async/limiter/generic.rb +74 -0
- data/lib/metrics/provider/async/limiter.rb +7 -0
- data/lib/traces/provider/async/limiter/generic.rb +41 -0
- data/lib/traces/provider/async/limiter.rb +7 -0
- data/license.md +25 -0
- data/readme.md +45 -0
- data/releases.md +50 -0
- data.tar.gz.sig +0 -0
- metadata +68 -83
- metadata.gz.sig +0 -0
- data/lib/async/limiter/concurrent.rb +0 -101
- data/lib/async/limiter/constants.rb +0 -6
- data/lib/async/limiter/unlimited.rb +0 -53
- data/lib/async/limiter/window/continuous.rb +0 -21
- data/lib/async/limiter/window/fixed.rb +0 -21
- data/lib/async/limiter/window/sliding.rb +0 -21
- 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
|
+
```
|