async 2.10.2 → 2.12.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ced20437db1c26026bbe526bc5c69c4ef467bf89fa7784eac27e5a4a0ad3d3a
4
- data.tar.gz: 34724c6fcc75517b86a8875482f744cc7cfe83bce1fe87fdde28cf2851b46b0f
3
+ metadata.gz: 1eef4bf800b6d52c0f273289186f9886975237ecdf9885f599617691283ca2e5
4
+ data.tar.gz: 14a7e20dc72c178b89a93233a73fd49f182f7aec7926804b9b8bf37e8ceb9f36
5
5
  SHA512:
6
- metadata.gz: 35919d63868bf8c0524807e448415224438c25bc8b87824bfec34d613f8febd9459c4367df5c9a3275cf5dc59e78769c7ba420e2492c3d172f2ec6e2015ee6a6
7
- data.tar.gz: f707fb4cca45592ac4d0ba4f2e41a25f80c22db5a452e0710a106095ca2d30a32753e652a0a46a1ebbd2bc1b0a3ee37917927efdff4ea2405c3fc0ec1b31ba24
6
+ metadata.gz: 30176358a5c9efc3df3e525e0ba941f5771bb7619bef28e1b6229a547ad3a24cb5475483a257704c3eea2d9214dcca2e17932994e0859a1c5d4dfc6401b24d48
7
+ data.tar.gz: 8b7353cf2ef0884c78a919775b84280d3234c7868c6c3b95aa00ae560a5825a07bd9533eda1afcc9776d1c94b7cc116e549e24144e4bab7c9bb3f086782a7456
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/async/barrier.md CHANGED
@@ -9,7 +9,7 @@ require 'async/barrier'
9
9
 
10
10
  barrier = Async::Barrier.new
11
11
  Sync do
12
- Console.logger.info("Barrier Example: sleep sort.")
12
+ Console.info("Barrier Example: sleep sort.")
13
13
 
14
14
  # Generate an array of 10 numbers:
15
15
  numbers = 10.times.map{rand(10)}
@@ -26,7 +26,7 @@ Sync do
26
26
  # Wait for all the numbers to be sorted:
27
27
  barrier.wait
28
28
 
29
- Console.logger.info("Sorted", sorted)
29
+ Console.info("Sorted", sorted)
30
30
  ensure
31
31
  # Ensure all the tasks are stopped when we exit:
32
32
  barrier.stop
@@ -9,14 +9,14 @@ Sync do
9
9
  condition = Async::Condition.new
10
10
 
11
11
  Async do
12
- Console.logger.info "Waiting for condition..."
12
+ Console.info "Waiting for condition..."
13
13
  value = condition.wait
14
- Console.logger.info "Condition was signalled: #{value}"
14
+ Console.info "Condition was signalled: #{value}"
15
15
  end
16
16
 
17
17
  Async do |task|
18
18
  task.sleep(1)
19
- Console.logger.info "Signalling condition..."
19
+ Console.info "Signalling condition..."
20
20
  condition.signal("Hello World")
21
21
  end
22
22
  end
@@ -11,7 +11,6 @@ require_relative 'task'
11
11
  require 'io/event'
12
12
 
13
13
  require 'console'
14
- require 'timers'
15
14
  require 'resolv'
16
15
 
17
16
  module Async
@@ -40,7 +39,7 @@ module Async
40
39
  @busy_time = 0.0
41
40
  @idle_time = 0.0
42
41
 
43
- @timers = ::Timers::Group.new
42
+ @timers = ::IO::Event::Timers.new
44
43
  end
45
44
 
46
45
  # Compute the scheduler load according to the busy and idle times that are updated by the run loop.
@@ -165,7 +164,7 @@ module Async
165
164
  @blocked -= 1
166
165
  end
167
166
  ensure
168
- timer&.cancel
167
+ timer&.cancel!
169
168
  end
170
169
 
171
170
  # @asynchronous May be called from any thread.
@@ -225,7 +224,7 @@ module Async
225
224
 
226
225
  return @selector.io_wait(fiber, io, events)
227
226
  ensure
228
- timer&.cancel
227
+ timer&.cancel!
229
228
  end
230
229
 
231
230
  if ::IO::Event::Support.buffer?
@@ -240,7 +239,7 @@ module Async
240
239
 
241
240
  @selector.io_read(fiber, io, buffer, length, offset)
242
241
  ensure
243
- timer&.cancel
242
+ timer&.cancel!
244
243
  end
245
244
 
246
245
  if RUBY_ENGINE != "ruby" || RUBY_VERSION >= "3.3.1"
@@ -255,7 +254,7 @@ module Async
255
254
 
256
255
  @selector.io_write(fiber, io, buffer, length, offset)
257
256
  ensure
258
- timer&.cancel
257
+ timer&.cancel!
259
258
  end
260
259
  end
261
260
  end
@@ -347,6 +346,7 @@ module Async
347
346
  Kernel::raise ClosedError if @selector.nil?
348
347
 
349
348
  initial_task = self.async(...) if block_given?
349
+ interrupt = nil
350
350
 
351
351
  begin
352
352
  # In theory, we could use Exception here to be a little bit safer, but we've only shown the case for SignalException to be a problem, so let's not over-engineer this.
@@ -359,17 +359,20 @@ module Async
359
359
  break unless self.run_once
360
360
  end
361
361
  end
362
- rescue Interrupt
362
+ rescue Interrupt => interrupt
363
363
  Thread.handle_interrupt(::SignalException => :never) do
364
364
  self.stop
365
365
  end
366
366
 
367
367
  retry
368
368
  end
369
-
369
+
370
+ # If the event loop was interrupted, and we finished exiting normally (due to the interrupt), we need to re-raise the interrupt so that the caller can handle it too.
371
+ Kernel.raise interrupt if interrupt
372
+
370
373
  return initial_task
371
374
  ensure
372
- Console.logger.debug(self) {"Exiting run-loop because #{$! ? $! : 'finished'}."}
375
+ Console.debug(self) {"Exiting run-loop because #{$! ? $! : 'finished'}."}
373
376
  end
374
377
 
375
378
  # Start an asynchronous task within the specified reactor. The task will be
@@ -395,7 +398,7 @@ module Async
395
398
  # - Avoid scheduler overhead if no blocking operation is performed.
396
399
  task.run(*arguments)
397
400
 
398
- # Console.logger.debug "Initial execution of task #{fiber} complete (#{result} -> #{fiber.alive?})..."
401
+ # Console.debug "Initial execution of task #{fiber} complete (#{result} -> #{fiber.alive?})..."
399
402
  return task
400
403
  end
401
404
 
@@ -416,7 +419,7 @@ module Async
416
419
 
417
420
  yield timer
418
421
  ensure
419
- timer.cancel if timer
422
+ timer&.cancel!
420
423
  end
421
424
 
422
425
  def timeout_after(duration, exception, message, &block)
@@ -17,9 +17,9 @@ Sync do
17
17
  # Search for the terms:
18
18
  terms.each do |term|
19
19
  semaphore.async do |task|
20
- Console.logger.info("Searching for #{term}...")
20
+ Console.info("Searching for #{term}...")
21
21
  response = Net::HTTP.get(URI "https://www.google.com/search?q=#{term}")
22
- Console.logger.info("Got response #{response.size} bytes.")
22
+ Console.info("Got response #{response.size} bytes.")
23
23
  end
24
24
  end
25
25
  end
data/lib/async/task.rb CHANGED
@@ -8,6 +8,7 @@
8
8
  # Copyright, 2023, by Math Ieu.
9
9
 
10
10
  require 'fiber'
11
+ require 'console/event/failure'
11
12
 
12
13
  require_relative 'node'
13
14
  require_relative 'condition'
@@ -335,15 +336,15 @@ module Async
335
336
  raise exception
336
337
  elsif @finished.nil?
337
338
  # If no one has called wait, we log this as a warning:
338
- Console.logger.warn(self, "Task may have ended with unhandled exception.", exception)
339
+ Console::Event::Failure.for(exception).emit(self, "Task may have ended with unhandled exception.", severity: :warn)
339
340
  else
340
- Console.logger.debug(self, exception)
341
+ Console::Event::Failure.for(exception).emit(self, severity: :debug)
341
342
  end
342
343
  end
343
344
  end
344
345
 
345
346
  def stopped!
346
- # Console.logger.info(self, status:) {"Task #{self} was stopped with #{@children&.size.inspect} children!"}
347
+ # Console.info(self, status:) {"Task #{self} was stopped with #{@children&.size.inspect} children!"}
347
348
  @status = :stopped
348
349
 
349
350
  stopped = false
@@ -374,7 +375,7 @@ module Async
374
375
 
375
376
  begin
376
377
  completed!(yield)
377
- # Console.logger.debug(self) {"Task was completed with #{@children.size} children!"}
378
+ # Console.debug(self) {"Task was completed with #{@children.size} children!"}
378
379
  rescue Stop
379
380
  stopped!
380
381
  rescue StandardError => error
@@ -382,7 +383,7 @@ module Async
382
383
  rescue Exception => exception
383
384
  failed!(exception, true)
384
385
  ensure
385
- # Console.logger.info(self) {"Task ensure $! = #{$!} with #{@children&.size.inspect} children!"}
386
+ # Console.info(self) {"Task ensure $! = #{$!} with #{@children&.size.inspect} children!"}
386
387
  finish!
387
388
  end
388
389
  end
data/lib/async/version.rb CHANGED
@@ -4,5 +4,5 @@
4
4
  # Copyright, 2017-2024, by Samuel Williams.
5
5
 
6
6
  module Async
7
- VERSION = "2.10.2"
7
+ VERSION = "2.12.1"
8
8
  end
data/lib/async/waiter.md CHANGED
@@ -38,7 +38,7 @@ Sync do
38
38
  # Stop all tasks which we don't care about:
39
39
  barrier.stop
40
40
 
41
- Console.logger.info("Smallest", numbers)
41
+ Console.info("Smallest", numbers)
42
42
  end
43
43
  ~~~
44
44
 
data/readme.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # ![Async](logo.svg)
2
2
 
3
- Async is a composable asynchronous I/O framework for Ruby based on [io-event](https://github.com/socketry/io-event) and
4
- [timers](https://github.com/socketry/timers).
3
+ Async is a composable asynchronous I/O framework for Ruby based on [io-event](https://github.com/socketry/io-event).
5
4
 
6
5
  > "Lately I've been looking into `async`, as one of my projects –
7
6
  > [tus-ruby-server](https://github.com/janko/tus-ruby-server) – would really benefit from non-blocking I/O. It's really
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.2
4
+ version: 2.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -62,7 +62,7 @@ cert_chain:
62
62
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
63
63
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
64
64
  -----END CERTIFICATE-----
65
- date: 2024-04-15 00:00:00.000000000 Z
65
+ date: 2024-06-23 00:00:00.000000000 Z
66
66
  dependencies:
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: console
@@ -70,14 +70,20 @@ dependencies:
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '1.10'
73
+ version: '1.25'
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 1.25.2
74
77
  type: :runtime
75
78
  prerelease: false
76
79
  version_requirements: !ruby/object:Gem::Requirement
77
80
  requirements:
78
81
  - - "~>"
79
82
  - !ruby/object:Gem::Version
80
- version: '1.10'
83
+ version: '1.25'
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 1.25.2
81
87
  - !ruby/object:Gem::Dependency
82
88
  name: fiber-annotation
83
89
  requirement: !ruby/object:Gem::Requirement
@@ -98,34 +104,20 @@ dependencies:
98
104
  requirements:
99
105
  - - "~>"
100
106
  - !ruby/object:Gem::Version
101
- version: '1.5'
107
+ version: '1.6'
102
108
  - - ">="
103
109
  - !ruby/object:Gem::Version
104
- version: 1.5.1
110
+ version: 1.6.5
105
111
  type: :runtime
106
112
  prerelease: false
107
113
  version_requirements: !ruby/object:Gem::Requirement
108
114
  requirements:
109
115
  - - "~>"
110
116
  - !ruby/object:Gem::Version
111
- version: '1.5'
117
+ version: '1.6'
112
118
  - - ">="
113
119
  - !ruby/object:Gem::Version
114
- version: 1.5.1
115
- - !ruby/object:Gem::Dependency
116
- name: timers
117
- requirement: !ruby/object:Gem::Requirement
118
- requirements:
119
- - - "~>"
120
- - !ruby/object:Gem::Version
121
- version: '4.1'
122
- type: :runtime
123
- prerelease: false
124
- version_requirements: !ruby/object:Gem::Requirement
125
- requirements:
126
- - - "~>"
127
- - !ruby/object:Gem::Version
128
- version: '4.1'
120
+ version: 1.6.5
129
121
  description:
130
122
  email:
131
123
  executables: []
@@ -180,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
172
  - !ruby/object:Gem::Version
181
173
  version: '0'
182
174
  requirements: []
183
- rubygems_version: 3.5.3
175
+ rubygems_version: 3.5.11
184
176
  signing_key:
185
177
  specification_version: 4
186
178
  summary: A concurrency framework for Ruby.
metadata.gz.sig CHANGED
Binary file