async 2.18.0 → 2.19.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/lib/async/console.rb +37 -0
- data/lib/async/scheduler.rb +8 -1
- data/lib/async/task.rb +2 -4
- data/lib/async/version.rb +1 -1
- data/readme.md +5 -0
- data/releases.md +43 -0
- data.tar.gz.sig +0 -0
- metadata +6 -5
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f095de1e8131ef68c86aeb0176f159d529614e0cc4550e09942c740602e5684c
|
4
|
+
data.tar.gz: 110037688f349d660617df61c86bd637c367a7f0bde68a1920aaac6c508b9de4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d287fb690ce18f7b75df003cc7f8a93752c347dc7c0dbcdfcd23fa42827368f228ffcb867482e69f94df87fb140b7bcf0da4ca666692504b1221052dd8c6f6ec
|
7
|
+
data.tar.gz: 8689282009332c05d4e6a958d1e612c77316f2e6084979b2201f073d5afc8e2d05e778d814f35de1a5c83f33c29e08221ca124c4367811f1bc5d92820de61e6b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2024, by Samuel Williams.
|
5
|
+
|
6
|
+
module Async
|
7
|
+
# Shims for the console gem, redirecting warnings and above to `Kernel#warn`.
|
8
|
+
#
|
9
|
+
# If you require this file, the `async` library will not depend on the `console` gem.
|
10
|
+
#
|
11
|
+
# That includes any gems that sit within the `Async` namespace.
|
12
|
+
#
|
13
|
+
# This is an experimental feature.
|
14
|
+
module Console
|
15
|
+
def self.debug(...)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.info(...)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.warn(*arguments, exception: nil, **options)
|
22
|
+
if exception
|
23
|
+
super(*arguments, exception.full_message, **options)
|
24
|
+
else
|
25
|
+
super(*arguments, **options)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.error(...)
|
30
|
+
self.warn(...)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.fatal(...)
|
34
|
+
self.warn(...)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/async/scheduler.rb
CHANGED
@@ -388,6 +388,11 @@ module Async
|
|
388
388
|
end
|
389
389
|
rescue Interrupt => interrupt
|
390
390
|
Thread.handle_interrupt(::SignalException => :never) do
|
391
|
+
Console.debug(self) do |buffer|
|
392
|
+
buffer.puts "Scheduler interrupted: #{interrupt.inspect}"
|
393
|
+
self.print_hierarchy(buffer)
|
394
|
+
end
|
395
|
+
|
391
396
|
self.stop
|
392
397
|
end
|
393
398
|
|
@@ -395,7 +400,9 @@ module Async
|
|
395
400
|
end
|
396
401
|
|
397
402
|
# 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.
|
398
|
-
|
403
|
+
if interrupt
|
404
|
+
Kernel.raise(interrupt)
|
405
|
+
end
|
399
406
|
end
|
400
407
|
|
401
408
|
# Run the reactor until all tasks are finished. Proxies arguments to {#async} immediately before entering the loop, if a block is provided.
|
data/lib/async/task.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
# Copyright, 2023, by Math Ieu.
|
9
9
|
|
10
10
|
require "fiber"
|
11
|
-
require "console
|
11
|
+
require "console"
|
12
12
|
|
13
13
|
require_relative "node"
|
14
14
|
require_relative "condition"
|
@@ -198,9 +198,7 @@ module Async
|
|
198
198
|
rescue => error
|
199
199
|
# I'm not completely happy with this overhead, but the alternative is to not log anything which makes debugging extremely difficult. Maybe we can introduce a debug wrapper which adds extra logging.
|
200
200
|
if @finished.nil?
|
201
|
-
Console
|
202
|
-
else
|
203
|
-
# Console::Event::Failure.for(error).emit(self, severity: :debug)
|
201
|
+
Console.warn(self, "Task may have ended with unhandled exception.", exception: error)
|
204
202
|
end
|
205
203
|
|
206
204
|
raise
|
data/lib/async/version.rb
CHANGED
data/readme.md
CHANGED
@@ -35,6 +35,11 @@ Please see the [project documentation](https://socketry.github.io/async/) for mo
|
|
35
35
|
|
36
36
|
Please see the [project releases](https://socketry.github.io/async/releases/index) for all releases.
|
37
37
|
|
38
|
+
### v2.19.0
|
39
|
+
|
40
|
+
- [Async::Scheduler Debugging](https://socketry.github.io/async/releases/index#async::scheduler-debugging)
|
41
|
+
- [Console Shims](https://socketry.github.io/async/releases/index#console-shims)
|
42
|
+
|
38
43
|
### v2.18.0
|
39
44
|
|
40
45
|
- Add support for `Sync(annotation:)`, so that you can annotate the block with a description of what it does, even if it doesn't create a new task.
|
data/releases.md
CHANGED
@@ -1,5 +1,48 @@
|
|
1
1
|
# Releases
|
2
2
|
|
3
|
+
## v2.19.0
|
4
|
+
|
5
|
+
### Async::Scheduler Debugging
|
6
|
+
|
7
|
+
Occasionally on issues, I encounter people asking for help and I need more information. Pressing Ctrl-C to exit a hung program is common, but it usually doesn't provide enough information to diagnose the problem. Setting the `CONSOLE_LEVEL=debug` environment variable will now print additional information about the scheduler when you interrupt it, including a backtrace of the current tasks.
|
8
|
+
|
9
|
+
> CONSOLE_LEVEL=debug bundle exec ruby ./test.rb
|
10
|
+
^C 0.0s debug: Async::Reactor [oid=0x974] [ec=0x988] [pid=9116] [2024-11-08 14:12:03 +1300]
|
11
|
+
| Scheduler interrupted: Interrupt
|
12
|
+
| #<Async::Reactor:0x0000000000000974 1 children (running)>
|
13
|
+
| #<Async::Task:0x000000000000099c /Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:185:in `transfer' (running)>
|
14
|
+
| → /Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:185:in `transfer'
|
15
|
+
| /Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:185:in `block'
|
16
|
+
| /Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:207:in `kernel_sleep'
|
17
|
+
| /Users/samuel/Developer/socketry/async/test.rb:7:in `sleep'
|
18
|
+
| /Users/samuel/Developer/socketry/async/test.rb:7:in `sleepy'
|
19
|
+
| /Users/samuel/Developer/socketry/async/test.rb:12:in `block in <top (required)>'
|
20
|
+
| /Users/samuel/Developer/socketry/async/lib/async/task.rb:197:in `block in run'
|
21
|
+
| /Users/samuel/Developer/socketry/async/lib/async/task.rb:420:in `block in schedule'
|
22
|
+
/Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:317:in `select': Interrupt
|
23
|
+
... (backtrace continues) ...
|
24
|
+
|
25
|
+
This gives better visibility into what the scheduler is doing, and should help diagnose issues.
|
26
|
+
|
27
|
+
### Console Shims
|
28
|
+
|
29
|
+
The `async` gem depends on `console` gem, because my goal was to have good logging by default without thinking about it too much. However, some users prefer to avoid using the `console` gem for logging, so I've added an experimental set of shims which should allow you to bypass the `console` gem entirely.
|
30
|
+
|
31
|
+
``` ruby
|
32
|
+
require 'async/console'
|
33
|
+
require 'async'
|
34
|
+
|
35
|
+
Async{raise "Boom"}
|
36
|
+
```
|
37
|
+
|
38
|
+
Will now use `Kernel#warn` to print the task failure warning:
|
39
|
+
|
40
|
+
#<Async::Task:0x00000000000012d4 /home/samuel/Developer/socketry/async/lib/async/task.rb:104:in `backtrace' (running)>
|
41
|
+
Task may have ended with unhandled exception.
|
42
|
+
(irb):4:in `block in <top (required)>': Boom (RuntimeError)
|
43
|
+
from /home/samuel/Developer/socketry/async/lib/async/task.rb:197:in `block in run'
|
44
|
+
from /home/samuel/Developer/socketry/async/lib/async/task.rb:420:in `block in schedule'
|
45
|
+
|
3
46
|
## v2.18.0
|
4
47
|
|
5
48
|
- Add support for `Sync(annotation:)`, so that you can annotate the block with a description of what it does, even if it doesn't create a new task.
|
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.
|
4
|
+
version: 2.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
@@ -63,7 +63,7 @@ cert_chain:
|
|
63
63
|
Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
|
64
64
|
voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
|
65
65
|
-----END CERTIFICATE-----
|
66
|
-
date: 2024-
|
66
|
+
date: 2024-11-08 00:00:00.000000000 Z
|
67
67
|
dependencies:
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
69
|
name: console
|
@@ -71,14 +71,14 @@ dependencies:
|
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '1.
|
74
|
+
version: '1.29'
|
75
75
|
type: :runtime
|
76
76
|
prerelease: false
|
77
77
|
version_requirements: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '1.
|
81
|
+
version: '1.29'
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
83
|
name: fiber-annotation
|
84
84
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,6 +125,7 @@ files:
|
|
125
125
|
- lib/async/clock.rb
|
126
126
|
- lib/async/condition.md
|
127
127
|
- lib/async/condition.rb
|
128
|
+
- lib/async/console.rb
|
128
129
|
- lib/async/idler.rb
|
129
130
|
- lib/async/list.rb
|
130
131
|
- lib/async/node.rb
|
@@ -168,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
169
|
- !ruby/object:Gem::Version
|
169
170
|
version: '0'
|
170
171
|
requirements: []
|
171
|
-
rubygems_version: 3.
|
172
|
+
rubygems_version: 3.5.11
|
172
173
|
signing_key:
|
173
174
|
specification_version: 4
|
174
175
|
summary: A concurrency framework for Ruby.
|
metadata.gz.sig
CHANGED
Binary file
|