Class: Async::Background::Runtime::TaskGroup

Inherits:
Object
  • Object
show all
Defined in:
lib/async/background/runtime/task_group.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(on_error: UNSET, on_release: nil) ⇒ TaskGroup

Returns a new instance of TaskGroup.



9
10
11
12
13
14
# File 'lib/async/background/runtime/task_group.rb', line 9

def initialize(on_error: UNSET, on_release: nil)
  @members = {}
  @drained = Notification.new
  @on_error = on_error
  @on_release = on_release
end

Instance Attribute Details

#on_releaseObject

Returns the value of attribute on_release.



7
8
9
# File 'lib/async/background/runtime/task_group.rb', line 7

def on_release
  @on_release
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


17
# File 'lib/async/background/runtime/task_group.rb', line 17

def empty? = @members.empty?

#release(task) ⇒ Object



62
63
64
65
66
67
# File 'lib/async/background/runtime/task_group.rb', line 62

def release(task)
  return unless @members.delete(task)

  @drained.signal_all if @members.empty?
  notify_release(task)
end

#sizeObject



16
# File 'lib/async/background/runtime/task_group.rb', line 16

def size = @members.size

#spawn(name: nil, &block) ⇒ Object

Raises:

  • (ArgumentError)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/async/background/runtime/task_group.rb', line 20

def spawn(name: nil, &block)
  raise ArgumentError, 'block required' unless block

  task = Task.new(name: name, group: self, on_error: @on_error)
  @members[task] = true

  begin
    task.start(&block)
  rescue Exception
    release(task)
    raise
  end

  task
end

#stop_all(grace = nil) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/async/background/runtime/task_group.rb', line 46

def stop_all(grace = nil)
  tasks.each do |task|
    task.stop
  rescue StandardError
    nil
  end

  return @members.empty? if grace.nil?

  begin
    wait(grace)
  rescue TimeoutError
    false
  end
end

#tasksObject



18
# File 'lib/async/background/runtime/task_group.rb', line 18

def tasks = @members.keys

#wait(timeout = nil) ⇒ Object



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

def wait(timeout = nil)
  deadline = Runtime.deadline_for(timeout)

  until @members.empty?
    raise TimeoutError, 'tasks did not finish in time' unless @drained.wait_until(deadline)
  end

  true
end