Pure Ruby timers collections suitable for use with event loops


Timers for Ruby Gem Version Build Status Code Climate Coverage Status MIT licensed

Collections of one-shot and periodic timers, intended for use with event loops.

Supported platforms

  • Ruby 2.0, 2.1, 2.2, and 2.3
  • JRuby 9000


Create a new timer group with Timers::Group.new:

require 'timers'

timers = Timers::Group.new

Schedule a proc to run after 5 seconds with Timers::Group#after:

five_second_timer = timers.after(5) { puts "Take five" }

The five_second_timer variable is now bound to a Timers::Timer object. To cancel a timer, use Timers::Timer#cancel

Once you've scheduled a timer, you can wait until the next timer fires with Timers::Group#wait:

# Waits 5 seconds

# The script will now print "Take five"

You can schedule a block to run periodically with Timers::Group#every:

every_five_seconds = timers.every(5) { puts "Another 5 seconds" }

loop { timers.wait }

You can also schedule a block to run immediately and periodically with Timers::Group#now_and_every:

now_and_every_five_seconds = timers.now_and_every(5) { puts "Now and in another 5 seconds" }

loop { timers.wait }

If you'd like another method to do the waiting for you, e.g. Kernel.select, you can use Timers::Group#wait_interval to obtain the amount of time to wait. When a timeout is encountered, you can fire all pending timers with Timers::Group#fire:

loop do
  interval = timers.wait_interval
  ready_readers, ready_writers = select readers, writers, nil, interval

  if ready_readers || ready_writers
    # Handle IO
    # Timeout!

You can also pause and continue individual timers, or all timers:

paused_timer = timers.every(5) { puts "I was paused" }

10.times { timers.wait } # will not fire paused timer

10.times { timers.wait } # will fire timer

10.times { timers.wait } # will not fire any timers

10.times { timers.wait } # will fire all timers


Copyright (c) 2012-2017 Timers Developers (given in the file AUTHORS.md).

Distributed under the MIT License. See LICENSE file for further details.