123456789_123456789_123456789_123456789_123456789_

Class: EventMachine::TickLoop

Relationships & Source Files
Inherits: Object
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

Class Method Summary

Instance Attribute Summary

Instance Method Summary

  • #on_stop(*a, &b)

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

  • #start

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

  • #stop

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

  • #schedule private

Constructor Details

.new(*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.

[ GitHub ]

  
# File 'lib/em/tick_loop.rb', line 35

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

Instance Attribute Details

#stopped?Boolean (readonly)

Query if the loop is stopped.

[ GitHub ]

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

def stopped?
  @stopped
end

Instance Method Details

#on_stop(*a, &b)

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

[ GitHub ]

  
# 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

#schedule (private)

[ GitHub ]

  
# File 'lib/em/tick_loop.rb', line 73

def schedule
  EM.next_tick do
    next if @stopped
    if @work.call == :stop
      stop
    else
      schedule
    end
  end
  self
end

#start

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

Raises:

  • (ArgumentError)
[ GitHub ]

  
# File 'lib/em/tick_loop.rb', line 66

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

#stop

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

[ GitHub ]

  
# File 'lib/em/tick_loop.rb', line 52

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