peach 0.2 → 0.4
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/lib/peach.rb +28 -4
- data/test/peach_test.rb +22 -2
- metadata +33 -25
data/lib/peach.rb
CHANGED
@@ -1,10 +1,34 @@
|
|
1
1
|
module Peach
|
2
|
-
def peach(
|
3
|
-
|
2
|
+
def peach(pool = nil, &b)
|
3
|
+
pool ||= $peach_default_threads || size
|
4
|
+
raise "Thread pool size less than one?" unless pool >= 1
|
5
|
+
div = (size/pool).to_i # should already be integer
|
6
|
+
div = 1 unless div >= 1 # each thread better do something!
|
7
|
+
|
8
|
+
threads = (0...size).step(div).map do |chunk|
|
9
|
+
Thread.new(chunk, [chunk+div,size].min) do |lower, upper|
|
10
|
+
(lower...upper).each{|j| yield(slice(j))}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
threads.each { |t| t.join }
|
14
|
+
self
|
4
15
|
end
|
5
16
|
|
6
|
-
def pmap(
|
7
|
-
|
17
|
+
def pmap(pool = nil, &b)
|
18
|
+
pool ||= $peach_default_threads || size
|
19
|
+
raise "Thread pool size less than one?" unless pool >= 1
|
20
|
+
div = (size/pool).to_i # should already be integer
|
21
|
+
div = 1 unless div >= 1 # each thread better do something!
|
22
|
+
|
23
|
+
result = Array.new(size)
|
24
|
+
|
25
|
+
threads = (0...size).step(div).map do |chunk|
|
26
|
+
Thread.new(chunk, [chunk+div,size].min) do |lower, upper|
|
27
|
+
(lower...upper).each{|j| result[j] = yield(slice(j))}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
threads.each { |t| t.join }
|
31
|
+
result
|
8
32
|
end
|
9
33
|
|
10
34
|
def pselect(n = nil, &b)
|
data/test/peach_test.rb
CHANGED
@@ -2,6 +2,8 @@ require File.join(File.dirname(__FILE__), "test_helper")
|
|
2
2
|
|
3
3
|
require File.join(File.dirname(__FILE__), "..", "lib", "peach")
|
4
4
|
|
5
|
+
require 'thread'
|
6
|
+
|
5
7
|
class PeachTest < Test::Unit::TestCase
|
6
8
|
[:peach, :pmap, :pselect].each do |f|
|
7
9
|
context "Parallel function #{f}" do
|
@@ -18,6 +20,24 @@ class PeachTest < Test::Unit::TestCase
|
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
23
|
+
[:peach, :pmap, :pselect].each do |f|
|
24
|
+
context "#{f}" do
|
25
|
+
[nil, 101, 99, 51, 49, 20, 5, 1].each do |pool|
|
26
|
+
should "invoke the block exactly once for each array item," +
|
27
|
+
" with thread pool size of #{pool.inspect}" do
|
28
|
+
source_array = (0...100).to_a
|
29
|
+
q = Queue.new()
|
30
|
+
source_array.send(f, pool) {|i| q.push(i)}
|
31
|
+
result_array = []
|
32
|
+
until q.empty?
|
33
|
+
result_array << q.pop
|
34
|
+
end
|
35
|
+
assert_equal source_array, result_array.sort
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
21
41
|
context "divvy" do
|
22
42
|
setup do
|
23
43
|
@data = [1, 2, 3, 4, 5]
|
@@ -41,12 +61,12 @@ class PeachTest < Test::Unit::TestCase
|
|
41
61
|
end
|
42
62
|
|
43
63
|
should "not lose any array elements" do
|
44
|
-
assert_equal @data.size, @data.send(:peach_divvy, 2).inject(0) {|sum, i|
|
64
|
+
assert_equal @data.size, @data.send(:peach_divvy, 2).inject(0) {|sum, i|
|
45
65
|
sum + i.size
|
46
66
|
}
|
47
67
|
end
|
48
68
|
end
|
49
|
-
|
69
|
+
|
50
70
|
context "when n is greater than array size" do
|
51
71
|
should "only create 'array size' divisions" do
|
52
72
|
assert_equal @data.size, @data.send(:peach_divvy, 42).size
|
metadata
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: peach
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 4
|
8
|
+
version: "0.4"
|
5
9
|
platform: ruby
|
6
10
|
authors:
|
7
|
-
- Ben Hughes
|
11
|
+
- Ben Hughes
|
8
12
|
autorequire:
|
9
13
|
bindir: bin
|
10
14
|
cert_chain: []
|
11
15
|
|
12
|
-
date:
|
16
|
+
date: 2010-11-17 00:00:00 -05:00
|
13
17
|
default_executable:
|
14
18
|
dependencies: []
|
15
19
|
|
@@ -22,41 +26,45 @@ extensions: []
|
|
22
26
|
extra_rdoc_files: []
|
23
27
|
|
24
28
|
files:
|
25
|
-
- README
|
26
|
-
- LICENSE
|
27
|
-
- Rakefile
|
28
|
-
- lib/peach.rb
|
29
|
-
- bn/peach_bn.rb
|
30
|
-
- bn/peach_test.rb
|
31
|
-
- test/test_helper.rb
|
32
|
-
- test/peach_test.rb
|
33
|
-
- web/index.html
|
34
|
-
- web/Peach.sketch.png
|
35
|
-
has_rdoc:
|
29
|
+
- README
|
30
|
+
- LICENSE
|
31
|
+
- Rakefile
|
32
|
+
- lib/peach.rb
|
33
|
+
- bn/peach_bn.rb
|
34
|
+
- bn/peach_test.rb
|
35
|
+
- test/test_helper.rb
|
36
|
+
- test/peach_test.rb
|
37
|
+
- web/index.html
|
38
|
+
- web/Peach.sketch.png
|
39
|
+
has_rdoc: true
|
36
40
|
homepage: http://peach.rubyforge.org
|
41
|
+
licenses: []
|
42
|
+
|
37
43
|
post_install_message:
|
38
44
|
rdoc_options: []
|
39
45
|
|
40
46
|
require_paths:
|
41
|
-
- lib
|
47
|
+
- lib
|
42
48
|
required_ruby_version: !ruby/object:Gem::Requirement
|
43
49
|
requirements:
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
segments:
|
53
|
+
- 0
|
54
|
+
version: "0"
|
48
55
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
56
|
requirements:
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
54
62
|
requirements: []
|
55
63
|
|
56
64
|
rubyforge_project:
|
57
|
-
rubygems_version: 1.3.
|
65
|
+
rubygems_version: 1.3.6
|
58
66
|
signing_key:
|
59
|
-
specification_version:
|
67
|
+
specification_version: 3
|
60
68
|
summary: Parallel Each and other parallel things
|
61
69
|
test_files: []
|
62
70
|
|