async-limiter 1.3.0 → 1.5.2
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/limiter/concurrent.rb +4 -2
- data/lib/async/limiter/unlimited.rb +4 -2
- data/lib/async/limiter/version.rb +1 -1
- data/lib/async/limiter/window.rb +22 -16
- data/lib/async/limiter/window/continuous.rb +3 -2
- data/lib/async/limiter/window/fixed.rb +3 -2
- data/lib/async/limiter/window/sliding.rb +3 -2
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 180ea4ebb784a29df337fe94e8190358482658fd07547ccaeaddc0974b271696
|
4
|
+
data.tar.gz: b02a1c5978f4b14e103852bbaa3685d8e1258b6d0190d1bb1e3c157a18b786e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0cd30fb437861e2077f1d15bd39a2bd9314ac64a7d48d2d303302a2c13c875cae02f042ad0d93531bf125475b62c1cc1b2e532279b044623f0b7b8765732bbb
|
7
|
+
data.tar.gz: abd67afa695c11d045f176cf5371046238050f951626cc5bc2f2b10a484ff567cd63e26ceb8b9896fb052b55682081d9bc421e9d6e489cdbc34c68fee38bc922
|
data/lib/async/limiter/window.rb
CHANGED
@@ -25,7 +25,7 @@ module Async
|
|
25
25
|
@lock = lock
|
26
26
|
|
27
27
|
@waiting = queue
|
28
|
-
@
|
28
|
+
@scheduler = nil
|
29
29
|
|
30
30
|
@window_frame_start_time = NULL_TIME
|
31
31
|
@window_start_time = NULL_TIME
|
@@ -56,8 +56,10 @@ module Async
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
def sync(*queue_args
|
60
|
-
acquire(*queue_args
|
59
|
+
def sync(*queue_args)
|
60
|
+
acquire(*queue_args) do
|
61
|
+
yield Task.current
|
62
|
+
end
|
61
63
|
end
|
62
64
|
|
63
65
|
def acquire(*queue_args)
|
@@ -168,34 +170,38 @@ module Async
|
|
168
170
|
end
|
169
171
|
|
170
172
|
def schedule?
|
171
|
-
@
|
173
|
+
@scheduler.nil? &&
|
172
174
|
@waiting.any? &&
|
173
175
|
!limit_blocking?
|
174
176
|
end
|
175
177
|
|
176
178
|
# Schedule resuming waiting tasks.
|
177
179
|
def schedule(parent: @parent || Task.current)
|
178
|
-
@
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
resume_waiting
|
184
|
-
end
|
180
|
+
return @scheduler if @scheduler
|
181
|
+
|
182
|
+
parent.async(transient: true) do |task|
|
183
|
+
@scheduler = task
|
184
|
+
task.annotate("scheduling tasks for #{self.class}.")
|
185
185
|
|
186
|
-
|
187
|
-
|
186
|
+
while @waiting.any? && !limit_blocking?
|
187
|
+
delay = [next_acquire_time - Clock.now, 0].max
|
188
|
+
task.sleep(delay) if delay.positive?
|
189
|
+
resume_waiting
|
190
|
+
end
|
191
|
+
ensure
|
192
|
+
@scheduler = nil
|
193
|
+
end
|
188
194
|
end
|
189
195
|
|
190
196
|
def reschedule?
|
191
|
-
@
|
197
|
+
@scheduler &&
|
192
198
|
@waiting.any? &&
|
193
199
|
!limit_blocking?
|
194
200
|
end
|
195
201
|
|
196
202
|
def reschedule
|
197
|
-
@
|
198
|
-
@
|
203
|
+
@scheduler.stop
|
204
|
+
@scheduler = nil
|
199
205
|
|
200
206
|
schedule
|
201
207
|
end
|
@@ -4,14 +4,15 @@ module Async
|
|
4
4
|
module Limiter
|
5
5
|
class Window
|
6
6
|
class Continuous < Window
|
7
|
-
def initialize(limit = 1, window: 1, parent: nil, lock: true)
|
7
|
+
def initialize(limit = 1, window: 1, parent: nil, lock: true, queue: [])
|
8
8
|
super(
|
9
9
|
limit,
|
10
10
|
type: :sliding, # type doesn't matter, but sliding is less work
|
11
11
|
burstable: false,
|
12
12
|
window: window,
|
13
13
|
parent: parent,
|
14
|
-
lock: lock
|
14
|
+
lock: lock,
|
15
|
+
queue: queue
|
15
16
|
)
|
16
17
|
end
|
17
18
|
end
|
@@ -4,14 +4,15 @@ module Async
|
|
4
4
|
module Limiter
|
5
5
|
class Window
|
6
6
|
class Fixed < Window
|
7
|
-
def initialize(limit = 1, window: 1, parent: nil, lock: true)
|
7
|
+
def initialize(limit = 1, window: 1, parent: nil, lock: true, queue: [])
|
8
8
|
super(
|
9
9
|
limit,
|
10
10
|
type: :fixed,
|
11
11
|
burstable: true,
|
12
12
|
window: window,
|
13
13
|
parent: parent,
|
14
|
-
lock: lock
|
14
|
+
lock: lock,
|
15
|
+
queue: queue
|
15
16
|
)
|
16
17
|
end
|
17
18
|
end
|
@@ -4,14 +4,15 @@ module Async
|
|
4
4
|
module Limiter
|
5
5
|
class Window
|
6
6
|
class Sliding < Window
|
7
|
-
def initialize(limit = 1, window: 1, parent: nil, lock: true)
|
7
|
+
def initialize(limit = 1, window: 1, parent: nil, lock: true, queue: [])
|
8
8
|
super(
|
9
9
|
limit,
|
10
10
|
type: :sliding,
|
11
11
|
burstable: true,
|
12
12
|
window: window,
|
13
13
|
parent: parent,
|
14
|
-
lock: lock
|
14
|
+
lock: lock,
|
15
|
+
queue: queue
|
15
16
|
)
|
16
17
|
end
|
17
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async-limiter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno Sutic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -16,70 +16,70 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.27'
|
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
|
-
version: '1.
|
26
|
+
version: '1.27'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: async-rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.15'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.15'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
47
|
+
version: '3.10'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.10'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rubocop-rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '2.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '2.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: standard
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
75
|
+
version: '0.9'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
82
|
+
version: '0.9'
|
83
83
|
description:
|
84
84
|
email: code@brunosutic.com
|
85
85
|
executables: []
|
@@ -114,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
114
|
- !ruby/object:Gem::Version
|
115
115
|
version: '0'
|
116
116
|
requirements: []
|
117
|
-
rubygems_version: 3.2.
|
117
|
+
rubygems_version: 3.2.3
|
118
118
|
signing_key:
|
119
119
|
specification_version: 4
|
120
120
|
summary: Async limiters
|