async 2.12.1 → 2.22.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/barrier.md +1 -1
- data/lib/async/barrier.rb +5 -5
- data/lib/async/clock.rb +10 -1
- data/lib/async/condition.md +1 -1
- data/lib/async/condition.rb +11 -6
- data/lib/async/console.rb +42 -0
- data/lib/async/idler.rb +21 -1
- data/lib/async/limited_queue.rb +7 -0
- data/lib/async/list.rb +7 -4
- data/lib/async/node.rb +48 -6
- data/lib/async/notification.rb +5 -3
- data/lib/async/queue.rb +82 -21
- data/lib/async/reactor.rb +4 -2
- data/lib/async/scheduler.rb +210 -75
- data/lib/async/semaphore.rb +3 -3
- data/lib/async/task.rb +114 -55
- data/lib/async/variable.rb +26 -5
- data/lib/async/version.rb +1 -1
- data/lib/async/waiter.rb +8 -3
- data/lib/async/worker_pool.rb +182 -0
- data/lib/async/wrapper.rb +6 -2
- data/lib/async.rb +2 -1
- data/lib/kernel/async.rb +4 -2
- data/lib/kernel/sync.rb +12 -5
- data/lib/metrics/provider/async/task.rb +22 -0
- data/lib/metrics/provider/async.rb +6 -0
- data/lib/traces/provider/async/barrier.rb +17 -0
- data/lib/traces/provider/async/task.rb +40 -0
- data/lib/traces/provider/async.rb +7 -0
- data/license.md +2 -1
- data/readme.md +49 -29
- data/releases.md +97 -0
- data.tar.gz.sig +0 -0
- metadata +45 -24
- metadata.gz.sig +0 -0
data/lib/kernel/async.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2019-
|
4
|
+
# Copyright, 2019-2024, by Samuel Williams.
|
5
5
|
|
6
6
|
require_relative "../async/reactor"
|
7
7
|
|
@@ -19,11 +19,13 @@ module Kernel
|
|
19
19
|
# @yields {|task| ...} The block that will execute asynchronously.
|
20
20
|
# @parameter task [Async::Task] The task that is executing the given block.
|
21
21
|
#
|
22
|
-
# @public Since
|
22
|
+
# @public Since *Async v1*.
|
23
23
|
# @asynchronous May block until given block completes executing.
|
24
24
|
def Async(...)
|
25
25
|
if current = ::Async::Task.current?
|
26
26
|
return current.async(...)
|
27
|
+
elsif scheduler = Fiber.scheduler
|
28
|
+
::Async::Task.run(scheduler, ...)
|
27
29
|
else
|
28
30
|
# This calls Fiber.set_scheduler(self):
|
29
31
|
reactor = ::Async::Reactor.new
|
data/lib/kernel/sync.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Released under the MIT License.
|
4
|
-
# Copyright, 2019-
|
4
|
+
# Copyright, 2019-2024, by Samuel Williams.
|
5
5
|
# Copyright, 2020, by Brian Morearty.
|
6
|
+
# Copyright, 2024, by Patrik Wenger.
|
6
7
|
|
7
8
|
require_relative "../async/reactor"
|
8
9
|
|
@@ -13,17 +14,23 @@ module Kernel
|
|
13
14
|
# @yields {|task| ...} The block that will execute asynchronously.
|
14
15
|
# @parameter task [Async::Task] The task that is executing the given block.
|
15
16
|
#
|
16
|
-
# @public Since
|
17
|
+
# @public Since *Async v1*.
|
17
18
|
# @asynchronous Will block until given block completes executing.
|
18
|
-
def Sync(&block)
|
19
|
+
def Sync(annotation: nil, &block)
|
19
20
|
if task = ::Async::Task.current?
|
20
|
-
|
21
|
+
if annotation
|
22
|
+
task.annotate(annotation) {yield task}
|
23
|
+
else
|
24
|
+
yield task
|
25
|
+
end
|
26
|
+
elsif scheduler = Fiber.scheduler
|
27
|
+
::Async::Task.run(scheduler, &block).wait
|
21
28
|
else
|
22
29
|
# This calls Fiber.set_scheduler(self):
|
23
30
|
reactor = Async::Reactor.new
|
24
31
|
|
25
32
|
begin
|
26
|
-
return reactor.run(finished: ::Async::Condition.new, &block).wait
|
33
|
+
return reactor.run(annotation: annotation, finished: ::Async::Condition.new, &block).wait
|
27
34
|
ensure
|
28
35
|
Fiber.set_scheduler(nil)
|
29
36
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2024, by Samuel Williams.
|
5
|
+
|
6
|
+
require_relative "../../../async/task"
|
7
|
+
require "metrics/provider"
|
8
|
+
|
9
|
+
Metrics::Provider(Async::Task) do
|
10
|
+
ASYNC_TASK_SCHEDULED = Metrics.metric("async.task.scheduled", :counter, description: "The number of tasks scheduled.")
|
11
|
+
ASYNC_TASK_FINISHED = Metrics.metric("async.task.finished", :counter, description: "The number of tasks finished.")
|
12
|
+
|
13
|
+
def schedule(&block)
|
14
|
+
ASYNC_TASK_SCHEDULED.emit(1)
|
15
|
+
|
16
|
+
super(&block)
|
17
|
+
rescue => error
|
18
|
+
raise
|
19
|
+
ensure
|
20
|
+
ASYNC_TASK_FINISHED.emit(1)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2022, by Samuel Williams.
|
5
|
+
|
6
|
+
require_relative "../../../async/barrier"
|
7
|
+
require "traces/provider"
|
8
|
+
|
9
|
+
Traces::Provider(Async::Barrier) do
|
10
|
+
def wait
|
11
|
+
attributes = {
|
12
|
+
"size" => self.size
|
13
|
+
}
|
14
|
+
|
15
|
+
Traces.trace("async.barrier.wait", attributes: attributes) {super}
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2022, by Samuel Williams.
|
5
|
+
|
6
|
+
require_relative "../../../async/task"
|
7
|
+
require "traces/provider"
|
8
|
+
|
9
|
+
Traces::Provider(Async::Task) do
|
10
|
+
def schedule(&block)
|
11
|
+
# If we are not actively tracing anything, then we can skip this:
|
12
|
+
unless Traces.active?
|
13
|
+
return super(&block)
|
14
|
+
end
|
15
|
+
|
16
|
+
unless self.transient?
|
17
|
+
trace_context = Traces.trace_context
|
18
|
+
end
|
19
|
+
|
20
|
+
attributes = {
|
21
|
+
# We use the instance variable as it corresponds to the user-provided block.
|
22
|
+
"block" => @block,
|
23
|
+
"transient" => self.transient?,
|
24
|
+
}
|
25
|
+
|
26
|
+
# Run the trace in the context of the child task:
|
27
|
+
super do
|
28
|
+
Traces.trace_context = trace_context
|
29
|
+
|
30
|
+
if annotation = self.annotation
|
31
|
+
attributes["annotation"] = annotation
|
32
|
+
end
|
33
|
+
|
34
|
+
Traces.trace("async.task", attributes: attributes) do
|
35
|
+
# Yes, this is correct, we already called super above:
|
36
|
+
yield
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/license.md
CHANGED
@@ -11,7 +11,7 @@ Copyright, 2020-2023, by Olle Jonsson.
|
|
11
11
|
Copyright, 2020, by Salim Semaoune.
|
12
12
|
Copyright, 2020, by Brian Morearty.
|
13
13
|
Copyright, 2020, by Stefan Wrobel.
|
14
|
-
Copyright, 2020, by Patrik Wenger.
|
14
|
+
Copyright, 2020-2024, by Patrik Wenger.
|
15
15
|
Copyright, 2020, by Ken Muryoi.
|
16
16
|
Copyright, 2020, by Jun Jiang.
|
17
17
|
Copyright, 2020-2022, by Bruno Sutic.
|
@@ -26,6 +26,7 @@ Copyright, 2023, by Math Ieu.
|
|
26
26
|
Copyright, 2023, by Emil Tin.
|
27
27
|
Copyright, 2023, by Gert Goet.
|
28
28
|
Copyright, 2024, by Dimitar Peychinov.
|
29
|
+
Copyright, 2024, by Jamie McCarthy.
|
29
30
|
|
30
31
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
31
32
|
of this software and associated documentation files (the "Software"), to deal
|
data/readme.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# 
|
2
2
|
|
3
3
|
Async is a composable asynchronous I/O framework for Ruby based on [io-event](https://github.com/socketry/io-event).
|
4
4
|
|
@@ -7,6 +7,7 @@ Async is a composable asynchronous I/O framework for Ruby based on [io-event](ht
|
|
7
7
|
> beautifully designed." *– [janko](https://github.com/janko)*
|
8
8
|
|
9
9
|
[](https://github.com/socketry/async/actions?workflow=Test)
|
10
|
+
[<img src="https://api.gitsponsors.com/api/badge/img?id=87380483" height="20"/>](https://api.gitsponsors.com/api/badge/link?p=U4gCxvzG7eUksiJSe0MSlPHWWhBYryqj6i48tx5L7/r/2NgkAToKb6dEm31bAftU3H+7BVwk3VhUBtE4GHqHJTPfWPR6xo2BQVoT15rFAGAsLFgdT2kKopIfCGV/QDOm7BrkodS2//R7NUMksAdaCQ==)
|
10
11
|
|
11
12
|
## Features
|
12
13
|
|
@@ -19,51 +20,70 @@ Async is a composable asynchronous I/O framework for Ruby based on [io-event](ht
|
|
19
20
|
|
20
21
|
Please see the [project documentation](https://socketry.github.io/async/) for more details.
|
21
22
|
|
22
|
-
- [Getting Started](https://socketry.github.io/async/guides/getting-started/index) - This guide shows how to add
|
23
|
-
async to your project and run code asynchronously.
|
23
|
+
- [Getting Started](https://socketry.github.io/async/guides/getting-started/index) - This guide shows how to add async to your project and run code asynchronously.
|
24
24
|
|
25
|
-
- [Asynchronous Tasks](https://socketry.github.io/async/guides/asynchronous-tasks/index) - This guide explains how
|
26
|
-
asynchronous tasks work and how to use them.
|
25
|
+
- [Asynchronous Tasks](https://socketry.github.io/async/guides/asynchronous-tasks/index) - This guide explains how asynchronous tasks work and how to use them.
|
27
26
|
|
28
|
-
- [
|
29
|
-
event loop is implemented.
|
27
|
+
- [Scheduler](https://socketry.github.io/async/guides/scheduler/index) - This guide gives an overview of how the scheduler is implemented.
|
30
28
|
|
31
|
-
- [Compatibility](https://socketry.github.io/async/guides/compatibility/index) - This guide gives an overview of the
|
32
|
-
compatibility of Async with Ruby and other frameworks.
|
29
|
+
- [Compatibility](https://socketry.github.io/async/guides/compatibility/index) - This guide gives an overview of the compatibility of Async with Ruby and other frameworks.
|
33
30
|
|
34
|
-
- [Best Practices](https://socketry.github.io/async/guides/best-practices/index) - This guide gives an overview of
|
35
|
-
best practices for using Async.
|
31
|
+
- [Best Practices](https://socketry.github.io/async/guides/best-practices/index) - This guide gives an overview of best practices for using Async.
|
36
32
|
|
37
|
-
|
33
|
+
- [Debugging](https://socketry.github.io/async/guides/debugging/index) - This guide explains how to debug issues with programs that use Async.
|
38
34
|
|
39
|
-
|
35
|
+
## Releases
|
40
36
|
|
41
|
-
|
42
|
-
2. Create your feature branch (`git checkout -b my-new-feature`).
|
43
|
-
3. Commit your changes (`git commit -am 'Add some feature'`).
|
44
|
-
4. Push to the branch (`git push origin my-new-feature`).
|
45
|
-
5. Create new Pull Request.
|
37
|
+
Please see the [project releases](https://socketry.github.io/async/releases/index) for all releases.
|
46
38
|
|
47
|
-
###
|
39
|
+
### v2.21.1
|
40
|
+
|
41
|
+
- [Worker Pool](https://socketry.github.io/async/releases/index#worker-pool)
|
48
42
|
|
49
|
-
|
43
|
+
### v2.20.0
|
50
44
|
|
51
|
-
|
45
|
+
- [Traces and Metrics Providers](https://socketry.github.io/async/releases/index#traces-and-metrics-providers)
|
52
46
|
|
53
|
-
|
47
|
+
### v2.19.0
|
48
|
+
|
49
|
+
- [Async::Scheduler Debugging](https://socketry.github.io/async/releases/index#async::scheduler-debugging)
|
50
|
+
- [Console Shims](https://socketry.github.io/async/releases/index#console-shims)
|
51
|
+
|
52
|
+
### v2.18.0
|
53
|
+
|
54
|
+
- 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.
|
55
|
+
|
56
|
+
### v2.17.0
|
57
|
+
|
58
|
+
- Introduce `Async::Queue#push` and `Async::Queue#pop` for compatibility with `::Queue`.
|
59
|
+
|
60
|
+
### v2.16.0
|
61
|
+
|
62
|
+
- [Better Handling of Async and Sync in Nested Fibers](https://socketry.github.io/async/releases/index#better-handling-of-async-and-sync-in-nested-fibers)
|
54
63
|
|
55
64
|
## See Also
|
56
65
|
|
57
|
-
- [async-io](https://github.com/socketry/async-io) — Asynchronous networking and sockets.
|
58
66
|
- [async-http](https://github.com/socketry/async-http) — Asynchronous HTTP client/server.
|
59
|
-
- [async-process](https://github.com/socketry/async-process) — Asynchronous process spawning/waiting.
|
60
67
|
- [async-websocket](https://github.com/socketry/async-websocket) — Asynchronous client and server websockets.
|
61
68
|
- [async-dns](https://github.com/socketry/async-dns) — Asynchronous DNS resolver and server.
|
62
|
-
- [async-rspec](https://github.com/socketry/async-rspec) — Shared contexts for running async specs.
|
63
|
-
|
64
|
-
### Projects Using Async
|
65
|
-
|
66
|
-
- [ciri](https://github.com/ciri-ethereum/ciri) — An Ethereum implementation written in Ruby.
|
67
69
|
- [falcon](https://github.com/socketry/falcon) — A rack compatible server built on top of `async-http`.
|
68
70
|
- [rubydns](https://github.com/ioquatix/rubydns) — An easy to use Ruby DNS server.
|
69
71
|
- [slack-ruby-bot](https://github.com/slack-ruby/slack-ruby-bot) — A client for making slack bots.
|
72
|
+
|
73
|
+
## Contributing
|
74
|
+
|
75
|
+
We welcome contributions to this project.
|
76
|
+
|
77
|
+
1. Fork it.
|
78
|
+
2. Create your feature branch (`git checkout -b my-new-feature`).
|
79
|
+
3. Commit your changes (`git commit -am 'Add some feature'`).
|
80
|
+
4. Push to the branch (`git push origin my-new-feature`).
|
81
|
+
5. Create new Pull Request.
|
82
|
+
|
83
|
+
### Developer Certificate of Origin
|
84
|
+
|
85
|
+
In order to protect users of this project, we require all contributors to comply with the [Developer Certificate of Origin](https://developercertificate.org/). This ensures that all contributions are properly licensed and attributed.
|
86
|
+
|
87
|
+
### Community Guidelines
|
88
|
+
|
89
|
+
This project is best served by a collaborative and respectful environment. Treat each other professionally, respect differing viewpoints, and engage constructively. Harassment, discrimination, or harmful behavior is not tolerated. Communicate clearly, listen actively, and support one another. If any issues arise, please inform the project maintainers.
|
data/releases.md
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# Releases
|
2
|
+
|
3
|
+
## v2.21.1
|
4
|
+
|
5
|
+
### Worker Pool
|
6
|
+
|
7
|
+
Ruby 3.4 will feature a new fiber scheduler hook, `blocking_operation_wait` which allows the scheduler to redirect the work given to `rb_nogvl` to a worker pool.
|
8
|
+
|
9
|
+
The Async scheduler optionally supports this feature using a worker pool, by using the following environment variable:
|
10
|
+
|
11
|
+
ASYNC_SCHEDULER_DEFAULT_WORKER_POOL=true
|
12
|
+
|
13
|
+
This will cause the scheduler to use a worker pool for general blocking operations, rather than blocking the event loop.
|
14
|
+
|
15
|
+
It should be noted that this isn't a net win, as the overhead of using a worker pool can be significant compared to the `rb_nogvl` work. As such, it is recommended to benchmark your application with and without the worker pool to determine if it is beneficial.
|
16
|
+
|
17
|
+
## v2.20.0
|
18
|
+
|
19
|
+
### Traces and Metrics Providers
|
20
|
+
|
21
|
+
Async now has [traces](https://github.com/socketry/traces) and [metrics](https://github.com/socketry/metrics) providers for various core classes. This allows you to emit traces and metrics to a suitable backend (including DataDog, New Relic, OpenTelemetry, etc.) for monitoring and debugging purposes.
|
22
|
+
|
23
|
+
To take advantage of this feature, you will need to introduce your own `config/traces.rb` and `config/metrics.rb`. Async's own repository includes these files for testing purposes, you could copy them into your own project and modify them as needed.
|
24
|
+
|
25
|
+
## v2.19.0
|
26
|
+
|
27
|
+
### Async::Scheduler Debugging
|
28
|
+
|
29
|
+
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.
|
30
|
+
|
31
|
+
> CONSOLE_LEVEL=debug bundle exec ruby ./test.rb
|
32
|
+
^C 0.0s debug: Async::Reactor [oid=0x974] [ec=0x988] [pid=9116] [2024-11-08 14:12:03 +1300]
|
33
|
+
| Scheduler interrupted: Interrupt
|
34
|
+
| #<Async::Reactor:0x0000000000000974 1 children (running)>
|
35
|
+
| #<Async::Task:0x000000000000099c /Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:185:in `transfer' (running)>
|
36
|
+
| → /Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:185:in `transfer'
|
37
|
+
| /Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:185:in `block'
|
38
|
+
| /Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:207:in `kernel_sleep'
|
39
|
+
| /Users/samuel/Developer/socketry/async/test.rb:7:in `sleep'
|
40
|
+
| /Users/samuel/Developer/socketry/async/test.rb:7:in `sleepy'
|
41
|
+
| /Users/samuel/Developer/socketry/async/test.rb:12:in `block in <top (required)>'
|
42
|
+
| /Users/samuel/Developer/socketry/async/lib/async/task.rb:197:in `block in run'
|
43
|
+
| /Users/samuel/Developer/socketry/async/lib/async/task.rb:420:in `block in schedule'
|
44
|
+
/Users/samuel/Developer/socketry/async/lib/async/scheduler.rb:317:in `select': Interrupt
|
45
|
+
... (backtrace continues) ...
|
46
|
+
|
47
|
+
This gives better visibility into what the scheduler is doing, and should help diagnose issues.
|
48
|
+
|
49
|
+
### Console Shims
|
50
|
+
|
51
|
+
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.
|
52
|
+
|
53
|
+
``` ruby
|
54
|
+
require 'async/console'
|
55
|
+
require 'async'
|
56
|
+
|
57
|
+
Async{raise "Boom"}
|
58
|
+
```
|
59
|
+
|
60
|
+
Will now use `Kernel#warn` to print the task failure warning:
|
61
|
+
|
62
|
+
#<Async::Task:0x00000000000012d4 /home/samuel/Developer/socketry/async/lib/async/task.rb:104:in `backtrace' (running)>
|
63
|
+
Task may have ended with unhandled exception.
|
64
|
+
(irb):4:in `block in <top (required)>': Boom (RuntimeError)
|
65
|
+
from /home/samuel/Developer/socketry/async/lib/async/task.rb:197:in `block in run'
|
66
|
+
from /home/samuel/Developer/socketry/async/lib/async/task.rb:420:in `block in schedule'
|
67
|
+
|
68
|
+
## v2.18.0
|
69
|
+
|
70
|
+
- 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.
|
71
|
+
|
72
|
+
## v2.17.0
|
73
|
+
|
74
|
+
- Introduce `Async::Queue#push` and `Async::Queue#pop` for compatibility with `::Queue`.
|
75
|
+
|
76
|
+
## v2.16.0
|
77
|
+
|
78
|
+
### Better Handling of Async and Sync in Nested Fibers
|
79
|
+
|
80
|
+
Interleaving bare fibers within `Async` and `Sync` blocks should not cause problems, but it presents a number of issues in the current implementation. Tracking the parent-child relationship between tasks, when they are interleaved with bare fibers, is difficult. The current implementation assumes that if there is no parent task, then it should create a new reactor. This is not always the case, as the parent task might not be visible due to nested Fibers. As a result, `Async` will create a new reactor, trying to stop the existing one, causing major internal consistency issues.
|
81
|
+
|
82
|
+
I encountered this issue when trying to use `Async` within a streaming response in Rails. The `protocol-rack` [uses a normal fiber to wrap streaming responses](https://github.com/socketry/protocol-rack/blob/cb1ca44e9deadb9369bdb2ea03416556aa927c5c/lib/protocol/rack/body/streaming.rb#L24-L28), and if you try to use `Async` within it, it will create a new reactor, causing the server to lock up.
|
83
|
+
|
84
|
+
Ideally, `Async` and `Sync` helpers should work when any `Fiber.scheduler` is defined. Right now, it's unrealistic to expect `Async::Task` to work in any scheduler, but at the very least, the following should work:
|
85
|
+
|
86
|
+
``` ruby
|
87
|
+
reactor = Async::Reactor.new # internally calls Fiber.set_scheduler
|
88
|
+
|
89
|
+
# This should run in the above reactor, rather than creating a new one.
|
90
|
+
Async do
|
91
|
+
puts "Hello World"
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
In order to do this, bare `Async` and `Sync` blocks should use `Fiber.scheduler` as a parent if possible.
|
96
|
+
|
97
|
+
See <https://github.com/socketry/async/pull/340> for more details.
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.22.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
- Bruno Sutic
|
9
9
|
- Jeremy Jung
|
10
10
|
- Olle Jonsson
|
11
|
+
- Patrik Wenger
|
11
12
|
- Devin Christensen
|
12
13
|
- Emil Tin
|
14
|
+
- Jamie McCarthy
|
13
15
|
- Kent Gruber
|
14
16
|
- Brian Morearty
|
15
17
|
- Colin Kelley
|
@@ -23,14 +25,12 @@ authors:
|
|
23
25
|
- Masafumi Okura
|
24
26
|
- Masayuki Yamamoto
|
25
27
|
- Math Ieu
|
26
|
-
- Patrik Wenger
|
27
28
|
- Ryan Musgrave
|
28
29
|
- Salim Semaoune
|
29
30
|
- Shannon Skipper
|
30
31
|
- Sokolov Yura
|
31
32
|
- Stefan Wrobel
|
32
33
|
- Trevor Turk
|
33
|
-
autorequire:
|
34
34
|
bindir: bin
|
35
35
|
cert_chain:
|
36
36
|
- |
|
@@ -62,7 +62,7 @@ cert_chain:
|
|
62
62
|
Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
|
63
63
|
voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
|
64
64
|
-----END CERTIFICATE-----
|
65
|
-
date:
|
65
|
+
date: 2025-02-07 00:00:00.000000000 Z
|
66
66
|
dependencies:
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
68
|
name: console
|
@@ -70,20 +70,14 @@ dependencies:
|
|
70
70
|
requirements:
|
71
71
|
- - "~>"
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version: '1.
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 1.25.2
|
73
|
+
version: '1.29'
|
77
74
|
type: :runtime
|
78
75
|
prerelease: false
|
79
76
|
version_requirements: !ruby/object:Gem::Requirement
|
80
77
|
requirements:
|
81
78
|
- - "~>"
|
82
79
|
- !ruby/object:Gem::Version
|
83
|
-
version: '1.
|
84
|
-
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: 1.25.2
|
80
|
+
version: '1.29'
|
87
81
|
- !ruby/object:Gem::Dependency
|
88
82
|
name: fiber-annotation
|
89
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,22 +98,42 @@ dependencies:
|
|
104
98
|
requirements:
|
105
99
|
- - "~>"
|
106
100
|
- !ruby/object:Gem::Version
|
107
|
-
version: '1.
|
108
|
-
|
101
|
+
version: '1.7'
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '1.7'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: traces
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "~>"
|
109
114
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
115
|
+
version: '0.15'
|
111
116
|
type: :runtime
|
112
117
|
prerelease: false
|
113
118
|
version_requirements: !ruby/object:Gem::Requirement
|
114
119
|
requirements:
|
115
120
|
- - "~>"
|
116
121
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
118
|
-
|
122
|
+
version: '0.15'
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: metrics
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0.12'
|
130
|
+
type: :runtime
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
119
135
|
- !ruby/object:Gem::Version
|
120
|
-
version:
|
121
|
-
description:
|
122
|
-
email:
|
136
|
+
version: '0.12'
|
123
137
|
executables: []
|
124
138
|
extensions: []
|
125
139
|
extra_rdoc_files: []
|
@@ -130,7 +144,9 @@ files:
|
|
130
144
|
- lib/async/clock.rb
|
131
145
|
- lib/async/condition.md
|
132
146
|
- lib/async/condition.rb
|
147
|
+
- lib/async/console.rb
|
133
148
|
- lib/async/idler.rb
|
149
|
+
- lib/async/limited_queue.rb
|
134
150
|
- lib/async/list.rb
|
135
151
|
- lib/async/node.rb
|
136
152
|
- lib/async/notification.rb
|
@@ -145,11 +161,18 @@ files:
|
|
145
161
|
- lib/async/version.rb
|
146
162
|
- lib/async/waiter.md
|
147
163
|
- lib/async/waiter.rb
|
164
|
+
- lib/async/worker_pool.rb
|
148
165
|
- lib/async/wrapper.rb
|
149
166
|
- lib/kernel/async.rb
|
150
167
|
- lib/kernel/sync.rb
|
168
|
+
- lib/metrics/provider/async.rb
|
169
|
+
- lib/metrics/provider/async/task.rb
|
170
|
+
- lib/traces/provider/async.rb
|
171
|
+
- lib/traces/provider/async/barrier.rb
|
172
|
+
- lib/traces/provider/async/task.rb
|
151
173
|
- license.md
|
152
174
|
- readme.md
|
175
|
+
- releases.md
|
153
176
|
homepage: https://github.com/socketry/async
|
154
177
|
licenses:
|
155
178
|
- MIT
|
@@ -157,7 +180,6 @@ metadata:
|
|
157
180
|
documentation_uri: https://socketry.github.io/async/
|
158
181
|
funding_uri: https://github.com/sponsors/ioquatix/
|
159
182
|
source_code_uri: https://github.com/socketry/async.git
|
160
|
-
post_install_message:
|
161
183
|
rdoc_options: []
|
162
184
|
require_paths:
|
163
185
|
- lib
|
@@ -165,15 +187,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
187
|
requirements:
|
166
188
|
- - ">="
|
167
189
|
- !ruby/object:Gem::Version
|
168
|
-
version: 3.1
|
190
|
+
version: '3.1'
|
169
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
192
|
requirements:
|
171
193
|
- - ">="
|
172
194
|
- !ruby/object:Gem::Version
|
173
195
|
version: '0'
|
174
196
|
requirements: []
|
175
|
-
rubygems_version: 3.
|
176
|
-
signing_key:
|
197
|
+
rubygems_version: 3.6.2
|
177
198
|
specification_version: 4
|
178
199
|
summary: A concurrency framework for Ruby.
|
179
200
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|