parallel 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +4 -18
- data/Rakefile +7 -1
- data/VERSION +1 -1
- data/lib/parallel.rb +9 -3
- data/parallel.gemspec +6 -3
- data/rdoc/README.rdoc +1 -0
- data/spec/cases/parallel_each.rb +9 -0
- data/spec/parallel_spec.rb +6 -0
- metadata +5 -2
data/README.markdown
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
Run any kind of code in parallel Processes or Threads, to speedup computation by factor #{your_cpus} X.
|
2
2
|
|
3
3
|
- Child processes are killed when your main process is killed through Ctrl+c or kill -2
|
4
|
+
- Processes/threads are workers, they grab the next piece of work when they finish
|
4
5
|
|
5
6
|
Install
|
6
7
|
=======
|
7
|
-
sudo gem install
|
8
|
+
sudo gem install parallel
|
8
9
|
|
9
10
|
Usage
|
10
11
|
=====
|
@@ -19,7 +20,6 @@ Usage
|
|
19
20
|
- Global data can be modified
|
20
21
|
- No extra memory used
|
21
22
|
|
22
|
-
Map-Reduce-Style
|
23
23
|
# 2 CPUs -> finished after 2 runs (a,b + c)
|
24
24
|
results = Parallel.map(['a','b','c']) do |one_letter|
|
25
25
|
expensive_calculation(letter)
|
@@ -31,22 +31,8 @@ Map-Reduce-Style
|
|
31
31
|
# 3 Threads -> finished after 1 run
|
32
32
|
results = Parallel.map(['a','b','c'], :in_threads=>3){|one_letter| ... }
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
#i -> 0...number_of_your_cpus
|
37
|
-
results = Parallel.in_processes do |i|
|
38
|
-
expensive_computation(data[i])
|
39
|
-
end
|
40
|
-
|
41
|
-
#i -> 0...4
|
42
|
-
results = Parallel.in_processes(4) do |i|
|
43
|
-
expensive_computation(data[i])
|
44
|
-
end
|
45
|
-
|
46
|
-
# Threads
|
47
|
-
results = Parallel.in_threads(4) do |i|
|
48
|
-
blocking_computation(data[i])
|
49
|
-
end
|
34
|
+
Same can be done with `each`
|
35
|
+
Parallel.each(['a','b','c']){|one_letter| ... }
|
50
36
|
|
51
37
|
TODO
|
52
38
|
====
|
data/Rakefile
CHANGED
@@ -5,7 +5,6 @@ task :default do
|
|
5
5
|
system("spec #{options} #{files}")
|
6
6
|
end
|
7
7
|
|
8
|
-
# fake task so that rubyforge:release works
|
9
8
|
task :rdoc do
|
10
9
|
end
|
11
10
|
|
@@ -20,6 +19,13 @@ begin
|
|
20
19
|
gem.authors = ["Michael Grosser"]
|
21
20
|
gem.rubyforge_project = 'parallel'
|
22
21
|
end
|
22
|
+
|
23
|
+
# fake task so that rubyforge:release works
|
24
|
+
task :rdoc do
|
25
|
+
`mkdir rdoc`
|
26
|
+
`echo documentation is at http://github.com/grosser/#{project_name} > rdoc/README.rdoc`
|
27
|
+
end
|
28
|
+
|
23
29
|
Jeweler::RubyforgeTasks.new
|
24
30
|
rescue LoadError
|
25
31
|
puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/lib/parallel.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'thread' # to get Thread.exclusive
|
2
|
+
|
1
3
|
class Parallel
|
2
4
|
VERSION = File.read( File.join(File.dirname(__FILE__),'..','VERSION') ).strip
|
3
5
|
|
@@ -51,9 +53,12 @@ class Parallel
|
|
51
53
|
out.map{|x| Marshal.load(x) } # Deserialize results
|
52
54
|
end
|
53
55
|
|
54
|
-
def self.
|
55
|
-
|
56
|
+
def self.each(array, options={}, &block)
|
57
|
+
map(array, options, &block)
|
58
|
+
array
|
59
|
+
end
|
56
60
|
|
61
|
+
def self.map(array, options = {})
|
57
62
|
if options[:in_threads]
|
58
63
|
method = :in_threads
|
59
64
|
size = options[method]
|
@@ -89,6 +94,7 @@ class Parallel
|
|
89
94
|
|
90
95
|
private
|
91
96
|
|
97
|
+
# split an array into groups of size items
|
92
98
|
def self.in_groups_of(array, size)
|
93
99
|
results = []
|
94
100
|
loop do
|
@@ -102,7 +108,7 @@ class Parallel
|
|
102
108
|
results
|
103
109
|
end
|
104
110
|
|
105
|
-
#handle user
|
111
|
+
#handle user interrupt (Ctrl+c)
|
106
112
|
def self.kill_on_ctrl_c(pids)
|
107
113
|
Signal.trap :SIGINT do
|
108
114
|
$stderr.puts 'Parallel execution interrupted, exiting ...'
|
data/parallel.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{parallel}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Michael Grosser"]
|
12
|
-
s.date = %q{2009-10-
|
12
|
+
s.date = %q{2009-10-11}
|
13
13
|
s.email = %q{grosser.michael@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"README.markdown"
|
@@ -20,6 +20,8 @@ Gem::Specification.new do |s|
|
|
20
20
|
"VERSION",
|
21
21
|
"lib/parallel.rb",
|
22
22
|
"parallel.gemspec",
|
23
|
+
"rdoc/README.rdoc",
|
24
|
+
"spec/cases/parallel_each.rb",
|
23
25
|
"spec/cases/parallel_influence_outside_data.rb",
|
24
26
|
"spec/cases/parallel_map.rb",
|
25
27
|
"spec/cases/parallel_map_sleeping.rb",
|
@@ -49,7 +51,8 @@ Gem::Specification.new do |s|
|
|
49
51
|
"spec/cases/parallel_map_sleeping.rb",
|
50
52
|
"spec/cases/parallel_map_uneven.rb",
|
51
53
|
"spec/cases/parallel_with_detected_cpus.rb",
|
52
|
-
"spec/cases/parallel_map.rb"
|
54
|
+
"spec/cases/parallel_map.rb",
|
55
|
+
"spec/cases/parallel_each.rb"
|
53
56
|
]
|
54
57
|
|
55
58
|
if s.respond_to? :specification_version then
|
data/rdoc/README.rdoc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
documentation is at http://github.com/grosser/parallel
|
data/spec/parallel_spec.rb
CHANGED
@@ -90,6 +90,12 @@ describe Parallel do
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
+
describe :each do
|
94
|
+
it "returns original array, works like map" do
|
95
|
+
`ruby spec/cases/parallel_each.rb`.should == '-b--c--d--a-a b c d'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
93
99
|
describe :in_groups_of do
|
94
100
|
it "works for empty" do
|
95
101
|
Parallel.send(:in_groups_of, [], 3).should == []
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parallel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Grosser
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-11 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -27,6 +27,8 @@ files:
|
|
27
27
|
- VERSION
|
28
28
|
- lib/parallel.rb
|
29
29
|
- parallel.gemspec
|
30
|
+
- rdoc/README.rdoc
|
31
|
+
- spec/cases/parallel_each.rb
|
30
32
|
- spec/cases/parallel_influence_outside_data.rb
|
31
33
|
- spec/cases/parallel_map.rb
|
32
34
|
- spec/cases/parallel_map_sleeping.rb
|
@@ -78,3 +80,4 @@ test_files:
|
|
78
80
|
- spec/cases/parallel_map_uneven.rb
|
79
81
|
- spec/cases/parallel_with_detected_cpus.rb
|
80
82
|
- spec/cases/parallel_map.rb
|
83
|
+
- spec/cases/parallel_each.rb
|