Class: EventMachine::TickLoop

Inherits:
Object
  • Object
show all
Defined in:
lib/em/tick_loop.rb

Overview

A TickLoop is useful when one needs to distribute amounts of work throughout ticks in order to maintain response times. It is also useful for simple repeated checks and metrics.

Examples:

# Here we run through an array one item per tick until it is empty, 
# printing each element.
# When the array is empty, we return :stop from the callback, and the
# loop will terminate.
# When the loop terminates, the on_stop callbacks will be called.  
EM.run do
  array = (1..100).to_a

  tickloop = EM.tick_loop do
    if array.empty?
      :stop
    else
      puts array.shift
    end
  end

  tickloop.on_stop { EM.stop }
end

Instance Method Summary collapse

Constructor Details

#initialize(*a, &b) ⇒ TickLoop

Arguments: A callback (EM::Callback) to call each tick. If the call returns :stop then the loop will be stopped. Any other value is ignored.



35
36
37
38
39
# File 'lib/em/tick_loop.rb', line 35

def initialize(*a, &b)
  @work = EM::Callback(*a, &b)
  @stops = []
  @stopped = true
end

Instance Method Details

#on_stop(*a, &b) ⇒ Object

Arguments: A callback (EM::Callback) to call once on the next stop (or immediately if already stopped).



43
44
45
46
47
48
49
# File 'lib/em/tick_loop.rb', line 43

def on_stop(*a, &b)
  if @stopped
    EM::Callback(*a, &b).call
  else
    @stops << EM::Callback(*a, &b)
  end
end

#startObject

Start the tick loop, will raise argument error if the loop is already running.

Raises:

  • (ArgumentError)


66
67
68
69
70
# File 'lib/em/tick_loop.rb', line 66

def start
  raise ArgumentError, "double start" unless @stopped
  @stopped = false
  schedule
end

#stopObject

Stop the tick loop immediately, and call it’s on_stop callbacks.



52
53
54
55
56
57
# File 'lib/em/tick_loop.rb', line 52

def stop
  @stopped = true
  until @stops.empty?
    @stops.shift.call
  end
end

#stopped?Boolean

Query if the loop is stopped.

Returns:

  • (Boolean)


60
61
62
# File 'lib/em/tick_loop.rb', line 60

def stopped?
  @stopped
end