class Waiter
A composable synchronization primitive, which allows one task to wait for a number of other tasks to complete. It can be used in conjunction with class Async::Semaphore
and/or class Async::Barrier
.
Signature
- deprecated
Async::Waiter
is deprecated, useAsync::Barrier
instead.
Definitions
def initialize(parent: nil, finished: Async::Condition.new)
Create a waiter instance.
Signature
-
parameter
parent
Interface(:async) | Nil
The parent task to use for asynchronous operations.
-
parameter
finished
Async::Condition
The condition to signal when a task completes.
Implementation
def initialize(parent: nil, finished: Async::Condition.new)
warn("`Async::Waiter` is deprecated, use `Async::Barrier` instead.", uplevel: 1, category: :deprecated) if $VERBOSE
@finished = finished
@done = []
@parent = parent
end
def async(parent: (@parent or Task.current), **options, &block)
- asynchronous
Execute a child task and add it to the waiter.
Signature
- asynchronous
Executes the given block concurrently.
Implementation
def async(parent: (@parent or Task.current), **options, &block)
parent.async(**options) do |task|
yield(task)
ensure
@done << task
@finished.signal
end
end
def first(count = nil)
Wait for the first count
tasks to complete.
Signature
-
parameter
count
Integer | Nil
The number of tasks to wait for.
-
returns
Array(Async::Task)
If an integer is given, the tasks which have completed.
-
returns
Async::Task
Otherwise, the first task to complete.
Implementation
def first(count = nil)
minimum = count || 1
while @done.size < minimum
@finished.wait
end
return @done.shift(*count)
end
def wait(count = nil)
Wait for the first count
tasks to complete.
Signature
-
parameter
count
Integer | Nil
The number of tasks to wait for.
Implementation
def wait(count = nil)
if count
first(count).map(&:wait)
else
first.wait
end
end