peach 0.4 → 0.5
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/Gemfile +3 -0
- data/Gemfile.lock +22 -0
- data/Rakefile +3 -0
- data/lib/peach.rb +42 -51
- data/lib/peach/version.rb +3 -0
- data/peach.gemspec +20 -0
- data/test/peach_test.rb +2 -37
- metadata +79 -51
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
peach (0.5)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
rake (0.9.2.2)
|
10
|
+
shoulda (3.0.1)
|
11
|
+
shoulda-context (~> 1.0.0)
|
12
|
+
shoulda-matchers (~> 1.0.0)
|
13
|
+
shoulda-context (1.0.0)
|
14
|
+
shoulda-matchers (1.0.0)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
ruby
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
peach!
|
21
|
+
rake
|
22
|
+
shoulda
|
data/Rakefile
CHANGED
data/lib/peach.rb
CHANGED
@@ -1,70 +1,61 @@
|
|
1
|
+
# monkey patch Enumerable by reopening it. Enumerable.send(:include, Peach)
|
2
|
+
# doesn't seem to work as it should.
|
1
3
|
module Peach
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
div = (size/pool).to_i # should already be integer
|
6
|
-
div = 1 unless div >= 1 # each thread better do something!
|
4
|
+
class EmptyThreadPoolError < RuntimeError
|
5
|
+
end
|
6
|
+
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
module Enumerable
|
9
|
+
def _peach_run(pool = nil, &b)
|
10
|
+
pool ||= $peach_default_threads || count
|
11
|
+
unless pool >= 1
|
12
|
+
raise Peach::EmptyThreadPoolError, "Thread pool size less than one"
|
13
|
+
end
|
14
|
+
div = (count/pool).to_i # should already be integer
|
15
|
+
div = 1 unless div >= 1 # each thread better do something!
|
16
|
+
|
17
|
+
threads = []
|
18
|
+
each_slice(div).with_index do |slice, idx|
|
19
|
+
threads << Thread.new(slice) do |thread_slice|
|
20
|
+
yield thread_slice, idx, div
|
11
21
|
end
|
12
22
|
end
|
13
|
-
threads.each
|
23
|
+
threads.each{|t| t.join }
|
14
24
|
self
|
15
25
|
end
|
16
26
|
|
17
|
-
def
|
18
|
-
pool
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
result = Array.new(size)
|
27
|
+
def peach(pool = nil, &b)
|
28
|
+
_peach_run(pool) do |thread_slice, idx, div|
|
29
|
+
thread_slice.each{|elt| yield elt}
|
30
|
+
end
|
31
|
+
end
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
def pmap(pool = nil, &b)
|
34
|
+
result = Array.new(count)
|
35
|
+
lock = Mutex.new
|
36
|
+
|
37
|
+
_peach_run(pool) do |thread_slice, idx, div|
|
38
|
+
thread_slice.each_with_index do |elt, offset|
|
39
|
+
local_result = yield elt
|
40
|
+
lock.synchronize do
|
41
|
+
result[(idx*div)+offset] = local_result
|
42
|
+
end
|
28
43
|
end
|
29
44
|
end
|
30
|
-
threads.each { |t| t.join }
|
31
45
|
result
|
32
46
|
end
|
33
47
|
|
34
|
-
def pselect(
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
48
|
+
def pselect(pool = nil, &b)
|
49
|
+
results, result = [],[]
|
50
|
+
lock = Mutex.new
|
39
51
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
52
|
+
_peach_run(pool) do |thread_slice, idx, div|
|
53
|
+
local_result = thread_slice.select(&b)
|
54
|
+
lock.synchronize do
|
55
|
+
results[idx] = local_result
|
56
|
+
end
|
45
57
|
end
|
46
|
-
threads.each {|t| t.join }
|
47
58
|
results.each {|x| result += x if x}
|
48
59
|
result
|
49
60
|
end
|
50
|
-
|
51
|
-
def peach_divvy(n = nil)
|
52
|
-
return [] if size == 0
|
53
|
-
|
54
|
-
n ||= $peach_default_threads || size
|
55
|
-
n = size if n > size
|
56
|
-
|
57
|
-
lists = []
|
58
|
-
|
59
|
-
div = (size/n).floor
|
60
|
-
offset = 0
|
61
|
-
for i in (0...n-1)
|
62
|
-
lists << slice(offset, div)
|
63
|
-
offset += div
|
64
|
-
end
|
65
|
-
lists << slice(offset...size)
|
66
|
-
lists
|
67
|
-
end
|
68
61
|
end
|
69
|
-
|
70
|
-
Array.send(:include, Peach)
|
data/peach.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "peach/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'peach'
|
7
|
+
s.version = Peach::VERSION
|
8
|
+
s.authors = ['Ben Hughes']
|
9
|
+
s.email = 'ben@pixelmachine.org'
|
10
|
+
s.summary = 'Parallel Each and other parallel things'
|
11
|
+
s.homepage = 'http://peach.rubyforge.org'
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split("\n")
|
14
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
|
18
|
+
s.add_development_dependency('rake')
|
19
|
+
s.add_development_dependency('shoulda')
|
20
|
+
end
|
data/test/peach_test.rb
CHANGED
@@ -10,12 +10,12 @@ class PeachTest < Test::Unit::TestCase
|
|
10
10
|
normal_f = f.to_s[1..-1].to_sym
|
11
11
|
|
12
12
|
setup do
|
13
|
-
@data = [1, 2, 3, 5, 8]
|
13
|
+
@data = [1, 2, 3, 5, 8]*10001
|
14
14
|
@block = lambda{|i| i**2}
|
15
15
|
end
|
16
16
|
should "return the same result as #{normal_f}" do
|
17
17
|
assert_equal @data.send(normal_f, &@block),
|
18
|
-
@data.send(f,
|
18
|
+
@data.send(f, 100, &@block)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -38,39 +38,4 @@ class PeachTest < Test::Unit::TestCase
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
context "divvy" do
|
42
|
-
setup do
|
43
|
-
@data = [1, 2, 3, 4, 5]
|
44
|
-
end
|
45
|
-
|
46
|
-
context "on empty list" do
|
47
|
-
should "return empty list" do
|
48
|
-
assert_equal [], [].send(:peach_divvy)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context "when n is nil" do
|
53
|
-
should "put 1 element into each division" do
|
54
|
-
assert_equal @data.size, @data.send(:peach_divvy).size
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
context "when n is less than array size" do
|
59
|
-
should "put create n divisions" do
|
60
|
-
assert_equal 2, @data.send(:peach_divvy, 2).size
|
61
|
-
end
|
62
|
-
|
63
|
-
should "not lose any array elements" do
|
64
|
-
assert_equal @data.size, @data.send(:peach_divvy, 2).inject(0) {|sum, i|
|
65
|
-
sum + i.size
|
66
|
-
}
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context "when n is greater than array size" do
|
71
|
-
should "only create 'array size' divisions" do
|
72
|
-
assert_equal @data.size, @data.send(:peach_divvy, 42).size
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
41
|
end
|
metadata
CHANGED
@@ -1,70 +1,98 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: peach
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 4
|
8
|
-
version: "0.4"
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.5'
|
5
|
+
prerelease:
|
9
6
|
platform: ruby
|
10
|
-
authors:
|
11
|
-
|
7
|
+
authors:
|
8
|
+
- Ben Hughes
|
12
9
|
autorequire:
|
13
10
|
bindir: bin
|
14
11
|
cert_chain: []
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
date: 2012-07-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: shoulda
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
20
46
|
description:
|
21
47
|
email: ben@pixelmachine.org
|
22
48
|
executables: []
|
23
|
-
|
24
49
|
extensions: []
|
25
|
-
|
26
50
|
extra_rdoc_files: []
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
51
|
+
files:
|
52
|
+
- Gemfile
|
53
|
+
- Gemfile.lock
|
54
|
+
- LICENSE
|
55
|
+
- README
|
56
|
+
- Rakefile
|
57
|
+
- bn/peach_bn.rb
|
58
|
+
- bn/peach_test.rb
|
59
|
+
- lib/peach.rb
|
60
|
+
- lib/peach/version.rb
|
61
|
+
- peach.gemspec
|
62
|
+
- test/peach_test.rb
|
63
|
+
- test/test_helper.rb
|
64
|
+
- web/Peach.sketch.png
|
65
|
+
- web/index.html
|
40
66
|
homepage: http://peach.rubyforge.org
|
41
67
|
licenses: []
|
42
|
-
|
43
68
|
post_install_message:
|
44
69
|
rdoc_options: []
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
requirements:
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
hash: 1425915303928506863
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
hash: 1425915303928506863
|
62
90
|
requirements: []
|
63
|
-
|
64
91
|
rubyforge_project:
|
65
|
-
rubygems_version: 1.
|
92
|
+
rubygems_version: 1.8.24
|
66
93
|
signing_key:
|
67
94
|
specification_version: 3
|
68
95
|
summary: Parallel Each and other parallel things
|
69
|
-
test_files:
|
70
|
-
|
96
|
+
test_files:
|
97
|
+
- test/peach_test.rb
|
98
|
+
- test/test_helper.rb
|