Skip to content

rjungemann/simple-queue

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple::Queue

Simple::Queue is a Ruby library that provides a non-blocking queue similar to the Queue library provided in Ruby's standard library. The difference is that this queue does not require jumping through hoops for non-blocking behavior.

An example:

require 'queue'

# Ruby `Queue` blocking example:
queue = Queue.new
queue << 'foo'
queue << 'bar'
queue.pop #=> 'foo'
queue.pop #=> 'bar'
queue.pop # Blocks until an item is pushed onto the queue from another thread.

# Ruby `Queue` non-blocking example:
queue = Queue.new
queue << 'foo'
queue << 'bar'
queue.pop(true) #=> 'foo'
queue.pop(true) #=> 'bar'
queue.pop(true) # Raises a `ThreadError`.

# Alternative approach:
queue = Queue.new
queue << 'foo'
queue << 'bar'
queue.pop(true) rescue nil #=> 'foo'
queue.pop(true) rescue nil #=> 'bar'
queue.pop(true) rescue nil #=> nil
queue.pop(true) rescue nil #=> nil

Whereas with Simple::Queue:

require 'simple/queue'

queue = Simple::Queue.new
queue << 'foo'
queue << 'bar'
queue.pop #=> 'foo'
queue.pop #=> 'bar'
queue.pop #=> nil
queue.pop #=> nil

In every other way, Simple::Queue acts like the Ruby queue, with the caveat that it will be minutely slower in the best case (since it is pure Ruby and not C), and faster in the worst case (since there is no rescuing of exceptions, which is slow in Ruby).

It is thread-safe, since all operations are wrapped in a Mutex. But since it does not block, there should be no opportunity for race conditions (every operation performs exactly one thing and returns).

It follows the API of Queue exactly:

# Create a new simple-queue.
Queue#initialize

# Clear all items out of the queue.
Queue#clear

# Returns `true` if there is nothing in the queue, and `false` otherwise.
Queue#empty?

# Returns how many items are in the queue.
Queue#length
Queue#size

# Puts an item in the queue.
Queue#push(obj)
Queue#<<(obj)
Queue#enq(obj)

# Removes an item from the queue, or returns `nil` if there are none. This
# method takes an optional argument, which is discarded. This is for
# compatibility with Ruby's `Queue` implementation.
#
Queue#pop
Queue#deq
Queue#shift

# Always returns `0`, since there is no opportunity to wait.
Queue#num_waiting

Installation

Add this line to your application's Gemfile:

gem 'simple-queue'

And then execute:

$ bundle

Or install it yourself as:

$ gem install simple-queue

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

TODO

  • Document code with RDoc.
  • More exhaustively test threading in test suite.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/rjungemann/simple-queue.

About

A dead-simple non-blocking queue.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published