async-limiter 1.5.0 → 1.5.4
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/version.rb +1 -1
- data/lib/async/limiter/window.rb +34 -17
- metadata +21 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69bd1687c9db3ae2672a5b2fb4458d127eb3521d5fc1db244f4ec7c773f32b39
|
4
|
+
data.tar.gz: 88b8a481dc2ad96e0b49aed1e80ddaa5871b0f8e36cd06526bf9854b32a1c23c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a656389da97b0990f90efa4dfbef3e58d01183969018a60b77b85704c014342d55eec954d00b3cf1870ccda8430843036ffcd49bc8449dba82a9b1c4f09d240
|
7
|
+
data.tar.gz: e63c0d3882fe2c3ad08648295bfe58a861f3ebaf1e0321ab2e6685dab5ec1a25e4184773206278497b2b94e15f67223f268dfdc16e1fb69f8a3db3b99919105c
|
data/lib/async/limiter/window.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "async/clock"
|
2
|
+
require "async/notification"
|
2
3
|
require "async/task"
|
3
4
|
require_relative "constants"
|
4
5
|
|
@@ -25,7 +26,9 @@ module Async
|
|
25
26
|
@lock = lock
|
26
27
|
|
27
28
|
@waiting = queue
|
28
|
-
@
|
29
|
+
@scheduler = nil
|
30
|
+
@yield_wait = false
|
31
|
+
@yield_notification = Notification.new
|
29
32
|
|
30
33
|
@window_frame_start_time = NULL_TIME
|
31
34
|
@window_start_time = NULL_TIME
|
@@ -58,7 +61,7 @@ module Async
|
|
58
61
|
|
59
62
|
def sync(*queue_args)
|
60
63
|
acquire(*queue_args) do
|
61
|
-
yield
|
64
|
+
yield Task.current
|
62
65
|
end
|
63
66
|
end
|
64
67
|
|
@@ -158,7 +161,14 @@ module Async
|
|
158
161
|
# slipping in operations before other waiting fibers get resumed.
|
159
162
|
if blocking? || @waiting.any?
|
160
163
|
@waiting.push(fiber, *queue_args) # queue_args used for custom queues
|
164
|
+
@yield_wait = true
|
161
165
|
schedule if schedule?
|
166
|
+
|
167
|
+
# Non-blocking signal, prevents race condition where scheduler would
|
168
|
+
# start resuming waiting fibers before below 'Task.yield' was reached.
|
169
|
+
@yield_notification.signal
|
170
|
+
@yield_wait = false # we're out of the woods
|
171
|
+
|
162
172
|
loop do
|
163
173
|
Task.yield # run this line at least once
|
164
174
|
break unless blocking?
|
@@ -170,36 +180,43 @@ module Async
|
|
170
180
|
end
|
171
181
|
|
172
182
|
def schedule?
|
173
|
-
@
|
183
|
+
@scheduler.nil? &&
|
174
184
|
@waiting.any? &&
|
175
185
|
!limit_blocking?
|
176
186
|
end
|
177
187
|
|
178
188
|
# Schedule resuming waiting tasks.
|
179
189
|
def schedule(parent: @parent || Task.current)
|
180
|
-
@
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
190
|
+
return @scheduler if @scheduler
|
191
|
+
|
192
|
+
parent.async(transient: true) do |task|
|
193
|
+
@scheduler = task
|
194
|
+
task.annotate("scheduling tasks for #{self.class}.")
|
195
|
+
|
196
|
+
while @waiting.any? && !limit_blocking?
|
197
|
+
delay = [next_acquire_time - Clock.now, 0].max
|
198
|
+
task.sleep(delay) if delay.positive?
|
189
199
|
|
190
|
-
|
191
|
-
|
200
|
+
# Waits for the task that started the scheduler to yield.
|
201
|
+
# See #wait for more details.
|
202
|
+
@yield_wait && @yield_notification&.wait
|
203
|
+
|
204
|
+
resume_waiting
|
205
|
+
end
|
206
|
+
ensure
|
207
|
+
@scheduler = nil
|
208
|
+
end
|
192
209
|
end
|
193
210
|
|
194
211
|
def reschedule?
|
195
|
-
@
|
212
|
+
@scheduler &&
|
196
213
|
@waiting.any? &&
|
197
214
|
!limit_blocking?
|
198
215
|
end
|
199
216
|
|
200
217
|
def reschedule
|
201
|
-
@
|
202
|
-
@
|
218
|
+
@scheduler.stop
|
219
|
+
@scheduler = nil
|
203
220
|
|
204
221
|
schedule
|
205
222
|
end
|
metadata
CHANGED
@@ -1,85 +1,91 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async-limiter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.4
|
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-12-30 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
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.27'
|
20
|
+
- - "<"
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
22
|
+
version: '3.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.27'
|
30
|
+
- - "<"
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
32
|
+
version: '3.0'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: async-rspec
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
39
|
+
version: '1.15'
|
34
40
|
type: :development
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
44
|
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
46
|
+
version: '1.15'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: rspec
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
53
|
+
version: '3.10'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
60
|
+
version: '3.10'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: rubocop-rspec
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
58
64
|
requirements:
|
59
65
|
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
67
|
+
version: '2.0'
|
62
68
|
type: :development
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
72
|
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
74
|
+
version: '2.0'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: standard
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
72
78
|
requirements:
|
73
79
|
- - "~>"
|
74
80
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
81
|
+
version: '0.9'
|
76
82
|
type: :development
|
77
83
|
prerelease: false
|
78
84
|
version_requirements: !ruby/object:Gem::Requirement
|
79
85
|
requirements:
|
80
86
|
- - "~>"
|
81
87
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
88
|
+
version: '0.9'
|
83
89
|
description:
|
84
90
|
email: code@brunosutic.com
|
85
91
|
executables: []
|
@@ -114,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
120
|
- !ruby/object:Gem::Version
|
115
121
|
version: '0'
|
116
122
|
requirements: []
|
117
|
-
rubygems_version: 3.2.
|
123
|
+
rubygems_version: 3.2.3
|
118
124
|
signing_key:
|
119
125
|
specification_version: 4
|
120
126
|
summary: Async limiters
|