Class: Async::Waiter

Inherits:
Object
  • Object
show all
Defined in:
lib/async/waiter.rb

Overview

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 Semaphore and/or Barrier.

Instance Method Summary collapse

Constructor Details

#initialize(parent: nil, finished: Async::Condition.new) ⇒ Waiter

Create a waiter instance.



14
15
16
17
18
19
# File 'lib/async/waiter.rb', line 14

def initialize(parent: nil, finished: Async::Condition.new)
	@finished = finished
	@done = []
	
	@parent = parent
end

Instance Method Details

#async(parent: (@parent or Task.current), **options, &block) ⇒ Object

Execute a child task and add it to the waiter.



23
24
25
26
27
28
29
30
# File 'lib/async/waiter.rb', line 23

def async(parent: (@parent or Task.current), **options, &block)
	parent.async(**options) do |task|
		yield(task)
	ensure
		@done << task
		@finished.signal
	end
end

#first(count = nil) ⇒ Object

Wait for the first ‘count` tasks to complete.



36
37
38
39
40
41
42
43
44
# File 'lib/async/waiter.rb', line 36

def first(count = nil)
	minimum = count || 1
	
	while @done.size < minimum
		@finished.wait
	end
	
	return @done.shift(*count)
end

#wait(count = nil) ⇒ Object

Wait for the first ‘count` tasks to complete.



48
49
50
51
52
53
54
# File 'lib/async/waiter.rb', line 48

def wait(count = nil)
	if count
		first(count).map(&:wait)
	else
		first.wait
	end
end