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.

# 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

- (TickLoop) initialize(*a, &b)

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

- (Object) on_stop(*a, &b)

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

- (Object) start

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

- (Object) stop

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

- (Boolean) stopped?

Query if the loop is stopped.

Returns:

  • (Boolean)


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

def stopped?
  @stopped
end