Class: Async::Idler

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

Overview

A load balancing mechanism that can be used process work when the system is idle.

Instance Method Summary collapse

Constructor Details

#initialize(maximum_load = 0.8, backoff: 0.01, parent: nil) ⇒ Idler

Create a new idler.

[View source]

16
17
18
19
20
# File 'lib/async/idler.rb', line 16

def initialize(maximum_load = 0.8, backoff: 0.01, parent: nil)
	@maximum_load = maximum_load
	@backoff = backoff
	@parent = parent
end

Instance Method Details

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

Wait until the system is idle, then execute the given block in a new task.

[View source]

30
31
32
33
34
35
# File 'lib/async/idler.rb', line 30

def async(*arguments, parent: (@parent or Task.current), **options, &block)
	wait
	
	# It is crucial that we optimistically execute the child task, so that we prevent a tight loop invoking this method from consuming all available resources.
	parent.async(*arguments, **options, &block)
end

#waitObject

Wait until the system is idle, according to the maximum load specified.

If the scheduler is overloaded, this method will sleep for an exponentially increasing amount of time.

[View source]

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/async/idler.rb', line 40

def wait
	scheduler = Fiber.scheduler
	backoff = nil
	
	while true
		load = scheduler.load
		
		break if load < @maximum_load
		
		if backoff
			sleep(backoff)
			backoff *= 2.0
		else
			scheduler.yield
			backoff = @backoff
		end
	end
end