Run any code in parallel Processes(> use all CPUs) or Threads(> speedup blocking operations).
Best suited for map-reduce or e.g. parallel downloads/uploads.
sudo gem install parallel
# 2 CPUs -> work in 2 processes (a,b + c)
results = Parallel.map(['a','b','c']) do |one_letter|
expensive_calculation(letter)
end
# 3 Processes -> finished after 1 run
results = Parallel.map(['a','b','c'], :in_processes=>3){|one_letter| ... }
# 3 Threads -> finished after 1 run
results = Parallel.map(['a','b','c'], :in_threads=>3){|one_letter| ... }
Same can be done with each
Parallel.each(['a','b','c']){|one_letter| ... }
or each_with_index
or map_with_index
- Speedup through multiple CPUs
- Speedup for blocking operations
- Protects global data
- Extra memory used ( very low on REE through
copy_on_write_friendly
) - Child processes are killed when your main process is killed through Ctrl+c or kill -2
- Speedup for blocking operations
- Global data can be modified
- No extra memory used
Processes/Threads are workers, they grab the next piece of work when they finish
- [ActiveRecord]
ActiveRecord::Base.connection.reconnect!
inside the parallel block prevents errors - [Benchmark/Test] Disable threading/forking with
:in_threads => 0
or:in_processes => 0
, great to test performance or to debug parallel issues
- JRuby / Windows support <-> possible ?
- Przemyslaw Wroblewski
- TJ Holowaychuk
- Masatomo Nakano
- Fred Wu
- mikezter
- Jeremy Durham
- Nick Gauthier
- Andrew Bowerman
- Byron Bowerman
- Mikko Kokkonen
Michael Grosser
michael@grosser.it
Hereby placed under public domain, do what you want, just do not hold me accountable...