async-limiter 1.3.1 → 1.5.3
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 +37 -16
- 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: dc95096df427d6b99502f8eb6f17f3cc0ec70598e093fd1d8aae5db50324d668
|
4
|
+
data.tar.gz: 21dfb9413922d3b20f1ee3f4ac9dbfd1ecdc5c2e08d12e9760c4b347cd941c0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3c074890ffa3befca024121f8988222539991ed43a99b99ccdcf2855b7e8219151ed118a2d549b490ad4992a2801c2af7e8fb43f315978176e1dab8db9657ec
|
7
|
+
data.tar.gz: 44ddac8caf55fa453604e57565e66c8bccd708cd710c76f65ad13f2408daa5442e3596dde2cd45e7a5bd33ed90e034a226c30cc98f85f57196e34059f7db4a7a
|
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
|
@@ -56,8 +59,10 @@ module Async
|
|
56
59
|
end
|
57
60
|
end
|
58
61
|
|
59
|
-
def sync(*queue_args
|
60
|
-
acquire(*queue_args
|
62
|
+
def sync(*queue_args)
|
63
|
+
acquire(*queue_args) do
|
64
|
+
yield Task.current
|
65
|
+
end
|
61
66
|
end
|
62
67
|
|
63
68
|
def acquire(*queue_args)
|
@@ -156,7 +161,14 @@ module Async
|
|
156
161
|
# slipping in operations before other waiting fibers get resumed.
|
157
162
|
if blocking? || @waiting.any?
|
158
163
|
@waiting.push(fiber, *queue_args) # queue_args used for custom queues
|
164
|
+
@yield_wait = true
|
159
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
|
+
|
160
172
|
loop do
|
161
173
|
Task.yield # run this line at least once
|
162
174
|
break unless blocking?
|
@@ -168,34 +180,43 @@ module Async
|
|
168
180
|
end
|
169
181
|
|
170
182
|
def schedule?
|
171
|
-
@
|
183
|
+
@scheduler.nil? &&
|
172
184
|
@waiting.any? &&
|
173
185
|
!limit_blocking?
|
174
186
|
end
|
175
187
|
|
176
188
|
# Schedule resuming waiting tasks.
|
177
189
|
def schedule(parent: @parent || Task.current)
|
178
|
-
@
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
resume_waiting
|
184
|
-
end
|
190
|
+
return @scheduler if @scheduler
|
191
|
+
|
192
|
+
parent.async(transient: true) do |task|
|
193
|
+
@scheduler = task
|
194
|
+
task.annotate("scheduling tasks for #{self.class}.")
|
185
195
|
|
186
|
-
|
187
|
-
|
196
|
+
while @waiting.any? && !limit_blocking?
|
197
|
+
delay = [next_acquire_time - Clock.now, 0].max
|
198
|
+
task.sleep(delay) if delay.positive?
|
199
|
+
|
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
|
188
209
|
end
|
189
210
|
|
190
211
|
def reschedule?
|
191
|
-
@
|
212
|
+
@scheduler &&
|
192
213
|
@waiting.any? &&
|
193
214
|
!limit_blocking?
|
194
215
|
end
|
195
216
|
|
196
217
|
def reschedule
|
197
|
-
@
|
198
|
-
@
|
218
|
+
@scheduler.stop
|
219
|
+
@scheduler = nil
|
199
220
|
|
200
221
|
schedule
|
201
222
|
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.3
|
4
|
+
version: 1.5.3
|
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
|