Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell, F#, C#, Java, and classic concurrency patterns. The design goals of this gem are:
|
|
gem install concurrent-ruby
or add the following line to Gemfile:
gem 'concurrent-ruby'
and run bundle install
from your shell.
NOTE: There is an old gem from 2007 called "concurrent" that does not appear to be under active development. That isn't us. Please do not run gem install concurrent
. It is not the droid you are looking for.
Please see the Concurrent Ruby Wiki or the API documentation for more information or join our mailing list.
There are many concurrency abstractions in this library. These abstractions can be broadly categorized into several general groups:
- Asynchronous concurrency abstractions including Async, Agent, Future, Promise, ScheduledTask, and TimerTask
- Erlang-inspired Supervisor and other lifecycle classes/mixins for managing long-running threads
- Thread-safe variables including M-Structures, I-Structures, thread-local variables, atomic counters, and software transactional memory
- Thread synchronization classes and algorithms including dataflow, timeout, condition, countdown latch, dependency counter, and event
- Java-inspired thread pools
- And many more...
This gem adheres to the rules of semantic versioning.
MRI 1.9.3, 2.0, 2.1, JRuby (1.9 mode), and Rubinius 2.x. This library is pure Ruby and has no gem dependencies. It should be fully compatible with any interpreter that is compliant with Ruby 1.9.3 or newer.
Many more code examples can be found in the documentation for each class (linked above). This one simple example shows some of the power of this gem.
require 'concurrent'
require 'thread' # for Queue
require 'open-uri' # for open(uri)
class Ticker
def get_year_end_closing(symbol, year)
uri = "http://ichart.finance.yahoo.com/table.csv?s=#{symbol}&a=11&b=01&c=#{year}&d=11&e=31&f=#{year}&g=m"
data = open(uri) {|f| f.collect{|line| line.strip } }
data[1].split(',')[4].to_f
end
end
# Future
price = Concurrent::Future.execute{ Ticker.new.get_year_end_closing('TWTR', 2013) }
price.state #=> :pending
sleep(1) # do other stuff
price.value #=> 63.65
price.state #=> :fulfilled
# Promise
prices = Concurrent::Promise.new{ puts Ticker.new.get_year_end_closing('AAPL', 2013) }.
then{ puts Ticker.new.get_year_end_closing('MSFT', 2013) }.
then{ puts Ticker.new.get_year_end_closing('GOOG', 2013) }.
then{ puts Ticker.new.get_year_end_closing('AMZN', 2013) }.execute
prices.state #=> :pending
sleep(1) # do other stuff
#=> 561.02
#=> 37.41
#=> 1120.71
#=> 398.79
# ScheduledTask
task = Concurrent::ScheduledTask.execute(2){ Ticker.new.get_year_end_closing('INTC', 2013) }
task.state #=> :pending
sleep(3) # do other stuff
task.value #=> 25.96
# Async
ticker = Ticker.new
ticker.extend(Concurrent::Async)
hpq = ticker.async.get_year_end_closing('HPQ', 2013)
ibm = ticker.await.get_year_end_closing('IBM', 2013)
hpq.value #=> 27.98
ibm.value #=> 187.57
- Jerry D'Antonio
- Michele Della Torre
- Chris Seaton
- Lucas Allan
- Petr Chalupa
- Ravil Bayramgalin
- Giuseppe Capizzi
- Brian Shirai
- Chip Miller
- Jamie Hodge
- Zander Hill
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request
Concurrent Ruby is free software released under the MIT License.
The Concurrent Ruby logo was designed by David Jones. It is Copyright © 2014 Jerry D'Antonio. All Rights Reserved.