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:
|
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
- 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.