AsyncSourceAsyncWaiter

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, use Async::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

Discussion