parallel 0.8.3 → 0.8.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/parallel.rb +1 -1
  3. data/lib/parallel/version.rb +1 -1
  4. metadata +2 -43
  5. data/.travis.yml +0 -5
  6. data/Gemfile +0 -6
  7. data/Gemfile.lock +0 -30
  8. data/MIT-LICENSE.txt +0 -20
  9. data/Rakefile +0 -7
  10. data/Readme.md +0 -119
  11. data/gem-public_cert.pem +0 -20
  12. data/parallel.gemspec +0 -17
  13. data/spec/cases/closes_processes_at_runtime.rb +0 -12
  14. data/spec/cases/count_open_pipes.rb +0 -6
  15. data/spec/cases/each.rb +0 -8
  16. data/spec/cases/each_with_index.rb +0 -5
  17. data/spec/cases/host_os_override_processor_count.rb +0 -4
  18. data/spec/cases/map_with_index.rb +0 -6
  19. data/spec/cases/map_with_index_empty.rb +0 -6
  20. data/spec/cases/map_with_killed_worker_before_read.rb +0 -9
  21. data/spec/cases/map_with_killed_worker_before_write.rb +0 -18
  22. data/spec/cases/map_with_nested_arrays_and_nil.rb +0 -7
  23. data/spec/cases/map_with_processes_and_break.rb +0 -10
  24. data/spec/cases/map_with_processes_and_exceptions.rb +0 -13
  25. data/spec/cases/map_with_threads_and_break.rb +0 -9
  26. data/spec/cases/map_with_threads_and_exceptions.rb +0 -12
  27. data/spec/cases/no_dump_with_each.rb +0 -21
  28. data/spec/cases/no_gc_with_each.rb +0 -5
  29. data/spec/cases/parallel_fast_exit.rb +0 -7
  30. data/spec/cases/parallel_high_fork_rate.rb +0 -6
  31. data/spec/cases/parallel_influence_outside_data.rb +0 -8
  32. data/spec/cases/parallel_map.rb +0 -6
  33. data/spec/cases/parallel_map_complex_objects.rb +0 -8
  34. data/spec/cases/parallel_map_range.rb +0 -6
  35. data/spec/cases/parallel_map_sleeping.rb +0 -5
  36. data/spec/cases/parallel_map_uneven.rb +0 -5
  37. data/spec/cases/parallel_raise.rb +0 -10
  38. data/spec/cases/parallel_raise_undumpable.rb +0 -17
  39. data/spec/cases/parallel_sleeping_2.rb +0 -5
  40. data/spec/cases/parallel_start_and_kill.rb +0 -12
  41. data/spec/cases/parallel_with_detected_cpus.rb +0 -6
  42. data/spec/cases/parallel_with_nil_uses_detected_cpus.rb +0 -6
  43. data/spec/cases/parallel_with_set_processes.rb +0 -6
  44. data/spec/parallel_spec.rb +0 -293
  45. data/spec/spec_helper.rb +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ab86105231bc6198ab1e5a144c1762311e427d7d
4
- data.tar.gz: af7f2091b8f87e0af1d7476d1707ee84f2a18360
3
+ metadata.gz: 8dfa83f77faeb4b7a88c8fe48f4c4c761a698a79
4
+ data.tar.gz: b671b7078d94652f32c4d3926389ae49a8757ec2
5
5
  SHA512:
6
- metadata.gz: 64694af8cef045688a0c1c5ab19117f5faa4d6c6b3b54eb6c5877d78c5fd7998b1e402b7bfd933d7e444bde0a232c10e56dcb85270fb18e8d40a0e40d52fbf49
7
- data.tar.gz: f6363fa0ea194f14f00daf84048e271b5ac4e7fdcc5e13ec261cf6fa695bd3e0d555b906ede99acb23f633d1781c925e6650375d75c734215b34ed3f5f3accb4
6
+ metadata.gz: d2cf2bef92031948c03f45f6fae48637f16042ed84eaf97aa88894ac35e1db35fcd8e4e12b43819efdf8a9fccfc3af4aa23329808ac174935c8184a349ee1660
7
+ data.tar.gz: 5baf3578ead853ac7643d176ffcfd38e9f73a3c96c622e2af14517f0dbad756e85ae2b62b45582b9be32fae9d1c4e3c9309dfb2bf93fc546a15178baedf6adae
data/lib/parallel.rb CHANGED
@@ -137,7 +137,7 @@ module Parallel
137
137
  def physical_processor_count
138
138
  @physical_processor_count ||= begin
139
139
  ppc = case RbConfig::CONFIG['host_os']
140
- when /darwin1/, /freebsd/
140
+ when /darwin1/
141
141
  `sysctl -n hw.physicalcpu`.to_i
142
142
  when /linux/
143
143
  cores_per_physical = `grep cores /proc/cpuinfo`[/\d+/].to_i
@@ -1,3 +1,3 @@
1
1
  module Parallel
2
- VERSION = Version = '0.8.3'
2
+ VERSION = Version = '0.8.4'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parallel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-20 00:00:00.000000000 Z
11
+ date: 2013-09-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: michael@grosser.it
@@ -16,49 +16,8 @@ executables: []
16
16
  extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
- - .travis.yml
20
- - Gemfile
21
- - Gemfile.lock
22
- - MIT-LICENSE.txt
23
- - Rakefile
24
- - Readme.md
25
- - gem-public_cert.pem
26
19
  - lib/parallel.rb
27
20
  - lib/parallel/version.rb
28
- - parallel.gemspec
29
- - spec/cases/closes_processes_at_runtime.rb
30
- - spec/cases/count_open_pipes.rb
31
- - spec/cases/each.rb
32
- - spec/cases/each_with_index.rb
33
- - spec/cases/host_os_override_processor_count.rb
34
- - spec/cases/map_with_index.rb
35
- - spec/cases/map_with_index_empty.rb
36
- - spec/cases/map_with_killed_worker_before_read.rb
37
- - spec/cases/map_with_killed_worker_before_write.rb
38
- - spec/cases/map_with_nested_arrays_and_nil.rb
39
- - spec/cases/map_with_processes_and_break.rb
40
- - spec/cases/map_with_processes_and_exceptions.rb
41
- - spec/cases/map_with_threads_and_break.rb
42
- - spec/cases/map_with_threads_and_exceptions.rb
43
- - spec/cases/no_dump_with_each.rb
44
- - spec/cases/no_gc_with_each.rb
45
- - spec/cases/parallel_fast_exit.rb
46
- - spec/cases/parallel_high_fork_rate.rb
47
- - spec/cases/parallel_influence_outside_data.rb
48
- - spec/cases/parallel_map.rb
49
- - spec/cases/parallel_map_complex_objects.rb
50
- - spec/cases/parallel_map_range.rb
51
- - spec/cases/parallel_map_sleeping.rb
52
- - spec/cases/parallel_map_uneven.rb
53
- - spec/cases/parallel_raise.rb
54
- - spec/cases/parallel_raise_undumpable.rb
55
- - spec/cases/parallel_sleeping_2.rb
56
- - spec/cases/parallel_start_and_kill.rb
57
- - spec/cases/parallel_with_detected_cpus.rb
58
- - spec/cases/parallel_with_nil_uses_detected_cpus.rb
59
- - spec/cases/parallel_with_set_processes.rb
60
- - spec/parallel_spec.rb
61
- - spec/spec_helper.rb
62
21
  homepage: https://github.com/grosser/parallel
63
22
  licenses:
64
23
  - MIT
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.8.7
4
- - 1.9.3
5
- - 2.0.0
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
- gemspec
3
-
4
- gem 'bump'
5
- gem 'rake'
6
- gem 'rspec', '~>2'
data/Gemfile.lock DELETED
@@ -1,30 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- parallel (0.8.3)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- bump (0.3.5)
10
- diff-lcs (1.1.3)
11
- rake (10.0.2)
12
- rspec (2.12.0)
13
- rspec-core (~> 2.12.0)
14
- rspec-expectations (~> 2.12.0)
15
- rspec-mocks (~> 2.12.0)
16
- rspec-core (2.12.0)
17
- rspec-expectations (2.12.0)
18
- diff-lcs (~> 1.1.3)
19
- rspec-mocks (2.12.0)
20
-
21
- PLATFORMS
22
- java
23
- ruby
24
- x86-mingw32
25
-
26
- DEPENDENCIES
27
- bump
28
- parallel!
29
- rake
30
- rspec (~> 2)
data/MIT-LICENSE.txt DELETED
@@ -1,20 +0,0 @@
1
- Copyright (C) 2013 Michael Grosser <michael@grosser.it>
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile DELETED
@@ -1,7 +0,0 @@
1
- require 'bundler/setup'
2
- require 'bundler/gem_tasks'
3
- require 'bump/tasks'
4
-
5
- task :default do
6
- sh "rspec spec/"
7
- end
data/Readme.md DELETED
@@ -1,119 +0,0 @@
1
- Run any code in parallel Processes(> use all CPUs) or Threads(> speedup blocking operations).<br/>
2
- Best suited for map-reduce or e.g. parallel downloads/uploads.
3
-
4
- Install
5
- =======
6
-
7
- ```Bash
8
- gem install parallel
9
- ```
10
-
11
- Usage
12
- =====
13
-
14
- ```Ruby
15
- # 2 CPUs -> work in 2 processes (a,b + c)
16
- results = Parallel.map(['a','b','c']) do |one_letter|
17
- expensive_calculation(one_letter)
18
- end
19
-
20
- # 3 Processes -> finished after 1 run
21
- results = Parallel.map(['a','b','c'], :in_processes=>3){|one_letter| ... }
22
-
23
- # 3 Threads -> finished after 1 run
24
- results = Parallel.map(['a','b','c'], :in_threads=>3){|one_letter| ... }
25
- ```
26
-
27
- Same can be done with `each`
28
- ```Ruby
29
- Parallel.each(['a','b','c']){|one_letter| ... }
30
- ```
31
- or `each_with_index` or `map_with_index`
32
-
33
- Processes/Threads are workers, they grab the next piece of work when they finish.
34
-
35
- ### Processes
36
- - Speedup through multiple CPUs
37
- - Speedup for blocking operations
38
- - Protects global data
39
- - Extra memory used ( very low on [REE](http://www.rubyenterpriseedition.com/faq.html) through `copy_on_write_friendly` )
40
- - Child processes are killed when your main process is killed through Ctrl+c or kill -2
41
-
42
- ### Threads
43
- - Speedup for blocking operations
44
- - Global data can be modified
45
- - No extra memory used
46
-
47
- ### ActiveRecord
48
-
49
- Try either of those to get working parallel AR
50
-
51
- ```Ruby
52
- Parallel.each(User.all, :in_threads => 8) do |user|
53
- ActiveRecord::Base.connection_pool.with_connection do
54
- user.update_attribute(:some_attribute, some_value)
55
- end
56
- end
57
-
58
- Parallel.each(User.all, :in_processes => 8) do |user|
59
- ActiveRecord::Base.connection.reconnect!
60
- user.update_attribute(:some_attribute, some_value)
61
- end
62
- ```
63
-
64
- ### Break
65
-
66
- ```Ruby
67
- Parallel.map(User.all) do |user|
68
- raise Parallel::Break # -> stop all execution
69
- end
70
- ```
71
-
72
- ### Progress / ETA
73
-
74
- ```Bash
75
- gem install ruby-progressbar
76
- ```
77
-
78
- ```Ruby
79
- require 'ruby-progressbar'
80
- progress = ProgressBar.create(:title => "The Progress", :total => 100)
81
- Parallel.map(1..100, :finish => lambda { |item, i| progress.increment }) { sleep 1 }
82
- ```
83
-
84
- Tips
85
- ====
86
- - [Benchmark/Test] Disable threading/forking with `:in_threads => 0` or `:in_processes => 0`, great to test performance or to debug parallel issues
87
-
88
- TODO
89
- ====
90
- - JRuby / Windows support <-> possible ?
91
-
92
- Authors
93
- =======
94
-
95
- ### [Contributors](https://github.com/grosser/parallel/contributors)
96
- - [Przemyslaw Wroblewski](http://github.com/lowang)
97
- - [TJ Holowaychuk](http://vision-media.ca/)
98
- - [Masatomo Nakano](http://twitter.com/masatomo2)
99
- - [Fred Wu](http://fredwu.me)
100
- - [mikezter](http://github.com/mikezter)
101
- - [Jeremy Durham](http://www.jeremydurham.com)
102
- - [Nick Gauthier](http://www.ngauthier.com)
103
- - [Andrew Bowerman](http://andrewbowerman.com)
104
- - [Byron Bowerman](http://me.bm5k.com/)
105
- - [Mikko Kokkonen](https://github.com/mikian)
106
- - [brian p o'rourke](https://github.com/bpo)
107
- - [Norio Sato]
108
- - [Neal Stewart](https://github.com/n-time)
109
- - [Jurriaan Pruis](http://github.com/jurriaan)
110
- - [Rob Worley](http://github.com/robworley)
111
- - [Tasveer Singh](https://github.com/tazsingh)
112
- - [Joachim](https://github.com/jmozmoz)
113
- - [yaoguai](https://github.com/yaoguai)
114
- - [Bartosz Dziewoński](https://github.com/MatmaRex)
115
-
116
- [Michael Grosser](http://grosser.it)<br/>
117
- michael@grosser.it<br/>
118
- License: MIT<br/>
119
- [![Build Status](https://travis-ci.org/grosser/parallel.png)](https://travis-ci.org/grosser/parallel)
data/gem-public_cert.pem DELETED
@@ -1,20 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MRAwDgYDVQQDDAdtaWNo
3
- YWVsMRcwFQYKCZImiZPyLGQBGRYHZ3Jvc3NlcjESMBAGCgmSJomT8ixkARkWAml0
4
- MB4XDTEzMDIwMzE4MTMxMVoXDTE0MDIwMzE4MTMxMVowPzEQMA4GA1UEAwwHbWlj
5
- aGFlbDEXMBUGCgmSJomT8ixkARkWB2dyb3NzZXIxEjAQBgoJkiaJk/IsZAEZFgJp
6
- dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMorXo/hgbUq97+kII9H
7
- MsQcLdC/7wQ1ZP2OshVHPkeP0qH8MBHGg6eYisOX2ubNagF9YTCZWnhrdKrwpLOO
8
- cPLaZbjUjljJ3cQR3B8Yn1veV5IhG86QseTBjymzJWsLpqJ1UZGpfB9tXcsFtuxO
9
- 6vHvcIHdzvc/OUkICttLbH+1qb6rsHUceqh+JrH4GrsJ5H4hAfIdyS2XMK7YRKbh
10
- h+IBu6dFWJJByzFsYmV1PDXln3UBmgAt65cmCu4qPfThioCGDzbSJrGDGLmw/pFX
11
- FPpVCm1zgYSb1v6Qnf3cgXa2f2wYGm17+zAVyIDpwryFru9yF/jJxE38z/DRsd9R
12
- /88CAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUsiNnXHtKeMYYcr4yJVmQ
13
- WONL+IwwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQAlyN7kKo/NQCQ0
14
- AOzZLZ3WAePvStkCFIJ53tsv5Kyo4pMAllv+BgPzzBt7qi605mFSL6zBd9uLou+W
15
- Co3s48p1dy7CjjAfVQdmVNHF3MwXtfC2OEyvSQPi4xKR8iba8wa3xp9LVo1PuLpw
16
- /6DsrChWw74HfsJN6qJOK684hJeT8lBYAUfiC3wD0owoPSg+XtyAAddisR+KV5Y1
17
- NmVHuLtQcNTZy+gRht3ahJRMuC6QyLmkTsf+6MaenwAMkAgHdswGsJztOnNnBa3F
18
- y0kCSWmK6D+x/SbfS6r7Ke07MRqziJdB9GuE1+0cIRuFh8EQ+LN6HXCKM5pon/GU
19
- ycwMXfl0
20
- -----END CERTIFICATE-----
data/parallel.gemspec DELETED
@@ -1,17 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
- name = "parallel"
3
- require "#{name}/version"
4
-
5
- Gem::Specification.new name, Parallel::VERSION do |s|
6
- s.summary = "Run any kind of code in parallel processes"
7
- s.authors = ["Michael Grosser"]
8
- s.email = "michael@grosser.it"
9
- s.homepage = "https://github.com/grosser/#{name}"
10
- s.files = `git ls-files`.split("\n")
11
- s.license = "MIT"
12
- key = File.expand_path("~/.ssh/gem-private_key.pem")
13
- if File.exist?(key)
14
- s.signing_key = key
15
- s.cert_chain = ["gem-public_cert.pem"]
16
- end
17
- end
@@ -1,12 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
- cmd = "ps uaxw|grep ruby|wc -l"
3
-
4
- processes_before = `#{cmd}`.to_i
5
- Parallel.each((0..10).to_a, :in_processes => 5) { |a| a*2 }
6
- processes_after = `#{cmd}`.to_i
7
-
8
- if processes_before == processes_after
9
- print 'OK'
10
- else
11
- print "FAIL: before:#{processes_before} -- after:#{processes_after}"
12
- end
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- results = Parallel.map(Array.new(20), :in_processes => 20) do
4
- `lsof | grep pipe | wc -l`.to_i
5
- end
6
- puts results.max
data/spec/cases/each.rb DELETED
@@ -1,8 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
- STDOUT.sync = true # otherwise results can go weird...
3
-
4
- x = ['a','b','c','d']
5
- result = Parallel.each(x) do |x|
6
- sleep 0.1 if x == 'a'
7
- end
8
- print result * ' '
@@ -1,5 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- Parallel.each_with_index(['a','b'], :in_threads => 2) do |x, i|
4
- print "#{x}#{i}"
5
- end
@@ -1,4 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- RbConfig::CONFIG["host_os"] = "flux_capacitor99.312.4"
4
- puts Parallel.processor_count
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- result = Parallel.map_with_index(['a','b']) do |x, i|
4
- "#{x}#{i}"
5
- end
6
- print result * ''
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- result = Parallel.map_with_index([]) do |x, i|
4
- "#{x}#{i}"
5
- end
6
- print result * ''
@@ -1,9 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- begin
4
- Parallel.map([1,2,3]) do |x, i|
5
- Process.kill("SIGKILL", Process.pid)
6
- end
7
- rescue Parallel::DeadWorker
8
- puts "DEAD"
9
- end
@@ -1,18 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- Parallel::Worker.class_eval do
4
- alias_method :work_without_kill, :work
5
- def work(*args)
6
- Process.kill("SIGKILL", pid)
7
- sleep 0.5
8
- work_without_kill(*args)
9
- end
10
- end
11
-
12
- begin
13
- Parallel.map([1,2,3]) do |x, i|
14
- Process.kill("SIGKILL", Process.pid)
15
- end
16
- rescue Parallel::DeadWorker
17
- puts "DEAD"
18
- end
@@ -1,7 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- result = Parallel.map([1,2,[3]]) do |x|
4
- [x, x] if x != 1
5
- end
6
-
7
- print result.inspect
@@ -1,10 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- result = Parallel.map(1..100, :in_processes => 4) do |x|
4
- sleep 0.1 # so all processes get started
5
- print x
6
- raise Parallel::Break if x == 1
7
- sleep 0.1 # so no now work gets queued before Parallel::Break is raised
8
- x
9
- end
10
- print " Parallel::Break raised - result #{result.inspect}"
@@ -1,13 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- begin
4
- Parallel.map(1..100, :in_processes => 4) do |x|
5
- sleep 0.1 # so all processes get started
6
- print x
7
- raise 'foo' if x == 1
8
- sleep 0.1 # so no now work gets queued before exception is raised
9
- x
10
- end
11
- rescue
12
- print ' raised'
13
- end
@@ -1,9 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- result = Parallel.map(1..100, :in_threads => 4) do |x|
4
- sleep 0.1 # so all threads get started
5
- print x
6
- raise Parallel::Break if x == 1
7
- sleep 0.1 # so no now work gets queued before Parallel::Break is raised
8
- end
9
- print " Parallel::Break raised - result #{result.inspect}"
@@ -1,12 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- begin
4
- Parallel.map(1..100, :in_threads => 4) do |x|
5
- sleep 0.1 # so all processes get started
6
- print x
7
- raise 'foo' if x == 1
8
- sleep 0.1 # so no now work gets queued before exception is raised
9
- end
10
- rescue
11
- print ' raised'
12
- end
@@ -1,21 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- class NotDumpable
4
- def marshal_dump
5
- raise "NOOOO"
6
- end
7
-
8
- def to_s
9
- 'not dumpable'
10
- end
11
- end
12
-
13
- Parallel.each([1]) do
14
- print 'no dump for result'
15
- NotDumpable.new
16
- end
17
-
18
- Parallel.each([NotDumpable.new]) do
19
- print 'no dump for each'
20
- 1
21
- end
@@ -1,5 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- Parallel.each(1..1000, :in_threads => 2) do |i|
4
- "xxxx" * 1_000_000
5
- end
@@ -1,7 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- Parallel.map([1,2,3], :in_processes => 2) do
4
- puts "I finished..."
5
- end
6
-
7
- sleep 10
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- Parallel.each((0..200).to_a, :in_processes=>200) do |x|
4
- sleep 1
5
- end
6
- print 'OK'
@@ -1,8 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- x = 'yes'
4
-
5
- Parallel.in_processes(2) do
6
- x = 'no'
7
- end
8
- print x
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- result = Parallel.map(['a','b','c','d']) do |x|
4
- "-#{x}-"
5
- end
6
- print result * ' '
@@ -1,8 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- object = ["\nasd#{File.read('Gemfile')}--#{File.read('Rakefile')}"*100, 12345, {:b=>:a}]
4
-
5
- result = Parallel.map([1,2]) do |x|
6
- object
7
- end
8
- print 'YES' if result.inspect == [object, object].inspect
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- result = Parallel.map(1..5) do |x|
4
- x
5
- end
6
- print result.inspect
@@ -1,5 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- Parallel.map(['a','b','c','d']) do |x|
4
- sleep 1
5
- end
@@ -1,5 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- Parallel.map([1,2,1,2]) do |x|
4
- sleep 2 if x == 1
5
- end
@@ -1,10 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- begin
4
- Parallel.in_processes(2) do
5
- raise "TEST"
6
- end
7
- puts "FAIL"
8
- rescue RuntimeError
9
- puts $!.message
10
- end
@@ -1,17 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
- require 'stringio'
3
-
4
- class MyException < Exception
5
- def initialize(object)
6
- @object = object
7
- end
8
- end
9
-
10
- begin
11
- Parallel.in_processes(2) do
12
- raise MyException.new(StringIO.new)
13
- end
14
- puts "FAIL"
15
- rescue RuntimeError
16
- puts $!.message
17
- end
@@ -1,5 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- Parallel.in_processes(5) do
4
- sleep 2
5
- end
@@ -1,12 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- method = case ARGV[0]
4
- when "PROCESS" then :in_processes
5
- when "THREAD" then :in_threads
6
- else raise "Learn to use this!"
7
- end
8
-
9
- Parallel.send(method, 2) do
10
- sleep 10
11
- puts "I should have been killed earlier..."
12
- end
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- x = Parallel.in_processes do
4
- "HELLO"
5
- end
6
- puts x
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- x = Parallel.in_processes(nil) do
4
- "HELLO"
5
- end
6
- puts x
@@ -1,6 +0,0 @@
1
- require File.expand_path('spec/spec_helper')
2
-
3
- x = Parallel.in_processes(5) do
4
- "HELLO"
5
- end
6
- puts x
@@ -1,293 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Parallel do
4
- def time_taken
5
- t = Time.now.to_f
6
- yield
7
- Time.now.to_f - t
8
- end
9
-
10
- def kill_process_with_name(file)
11
- running_processes = `ps -f`.split("\n").map{ |line| line.split(/\s+/) }
12
- pid_index = running_processes.detect { |p| p.include?("UID") }.index("UID") + 1
13
- parent_pid = running_processes.detect { |p| p.include?(file) and not p.include?("sh") }[pid_index]
14
- `kill -2 #{parent_pid}`
15
- end
16
-
17
- describe ".processor_count" do
18
- it "returns a number" do
19
- (1..999).should include(Parallel.processor_count)
20
- end
21
-
22
- if RUBY_PLATFORM =~ /darwin10/
23
- it 'works if hwprefs in not available' do
24
- Parallel.should_receive(:hwprefs_available?).and_return false
25
- (1..999).should include(Parallel.processor_count)
26
- end
27
- end
28
-
29
- it "defaults to 1 if we don't know better" do
30
- `ruby spec/cases/host_os_override_processor_count.rb 2>/dev/null`.to_i.should == 1
31
- end
32
- end
33
-
34
- describe ".physical_processor_count" do
35
- it "returns a number" do
36
- (1..999).should include(Parallel.physical_processor_count)
37
- end
38
-
39
- it "is even factor of logical cpus" do
40
- pending if ENV["TRAVIS"]
41
- (Parallel.processor_count % Parallel.physical_processor_count).should == 0
42
- end
43
- end
44
-
45
- describe ".in_processes" do
46
- def cpus
47
- Parallel.processor_count
48
- end
49
-
50
- it "executes with detected cpus" do
51
- `ruby spec/cases/parallel_with_detected_cpus.rb`.should == "HELLO\n" * cpus
52
- end
53
-
54
- it "executes with detected cpus when nil was given" do
55
- `ruby spec/cases/parallel_with_nil_uses_detected_cpus.rb`.should == "HELLO\n" * cpus
56
- end
57
-
58
- it "set amount of parallel processes" do
59
- `ruby spec/cases/parallel_with_set_processes.rb`.should == "HELLO\n" * 5
60
- end
61
-
62
- it "does not influence outside data" do
63
- `ruby spec/cases/parallel_influence_outside_data.rb`.should == "yes"
64
- end
65
-
66
- it "kills the processes when the main process gets killed through ctrl+c" do
67
- time_taken{
68
- lambda{
69
- t = Thread.new { `ruby spec/cases/parallel_start_and_kill.rb PROCESS` }
70
- sleep 1
71
- kill_process_with_name("spec/cases/parallel_start_and_kill.rb") #simulates Ctrl+c
72
- sleep 1
73
- puts t.value
74
- }.should_not change{`ps`.split("\n").size}
75
- }.should <= 3
76
- end
77
-
78
- it "kills the threads when the main process gets killed through ctrl+c" do
79
- time_taken{
80
- lambda{
81
- Thread.new { `ruby spec/cases/parallel_start_and_kill.rb THREAD` }
82
- sleep 1
83
- kill_process_with_name("spec/cases/parallel_start_and_kill.rb") #simulates Ctrl+c
84
- sleep 1
85
- }.should_not change{`ps`.split("\n").size}
86
- }.should <= 3
87
- end
88
-
89
- it "does not kill anything on ctrl+c when everything has finished" do
90
- time_taken do
91
- t = Thread.new { `ruby spec/cases/parallel_fast_exit.rb 2>&1` }
92
- sleep 2
93
- kill_process_with_name("spec/cases/parallel_fast_exit.rb") #simulates Ctrl+c
94
- sleep 1
95
- result = t.value
96
- result.scan(/I finished/).size.should == 3
97
- result.should_not include("Parallel execution interrupted")
98
- end.should <= 4
99
- end
100
-
101
- it "saves time" do
102
- time_taken{
103
- `ruby spec/cases/parallel_sleeping_2.rb`
104
- }.should < 3.5
105
- end
106
-
107
- it "raises when one of the processes raises" do
108
- `ruby spec/cases/parallel_raise.rb`.strip.should == 'TEST'
109
- end
110
-
111
- it "can raise an undumpable exception" do
112
- `ruby spec/cases/parallel_raise_undumpable.rb`.strip.should include('Undumpable Exception')
113
- end
114
-
115
- it 'can handle to high fork rate' do
116
- `ruby spec/cases/parallel_high_fork_rate.rb`.should == 'OK'
117
- end
118
-
119
- it 'does not leave processes behind while running' do
120
- `ruby spec/cases/closes_processes_at_runtime.rb`.should == 'OK'
121
- end
122
-
123
- it "does not open unnecessary pipes" do
124
- open_pipes = `lsof | grep pipe | wc -l`.to_i
125
- max_pipes = `ruby spec/cases/count_open_pipes.rb`.to_i
126
- (max_pipes - open_pipes).should < 400
127
- end
128
- end
129
-
130
- describe ".in_threads" do
131
- it "saves time" do
132
- time_taken{
133
- Parallel.in_threads(3){ sleep 2 }
134
- }.should < 3
135
- end
136
-
137
- it "does not create new processes" do
138
- lambda{ Thread.new{ Parallel.in_threads(2){sleep 1} } }.should_not change{`ps`.split("\n").size}
139
- end
140
-
141
- it "returns results as array" do
142
- Parallel.in_threads(4){|i| "XXX#{i}"}.should == ["XXX0",'XXX1','XXX2','XXX3']
143
- end
144
-
145
- it "raises when a thread raises" do
146
- lambda{ Parallel.in_threads(2){|i| raise "TEST"} }.should raise_error("TEST")
147
- end
148
- end
149
-
150
- describe ".map" do
151
- it "saves time" do
152
- time_taken{
153
- `ruby spec/cases/parallel_map_sleeping.rb`
154
- }.should <= 3.5
155
- end
156
-
157
- it "executes with given parameters" do
158
- `ruby spec/cases/parallel_map.rb`.should == "-a- -b- -c- -d-"
159
- end
160
-
161
- it "can dump/load complex objects" do
162
- `ruby spec/cases/parallel_map_complex_objects.rb`.should == "YES"
163
- end
164
-
165
- it "starts new process imediatly when old exists" do
166
- time_taken{
167
- `ruby spec/cases/parallel_map_uneven.rb`
168
- }.should <= 3.5
169
- end
170
-
171
- it "does not flatten results" do
172
- Parallel.map([1,2,3], :in_threads=>2){|x| [x,x]}.should == [[1,1],[2,2],[3,3]]
173
- end
174
-
175
- it "can run in threads" do
176
- Parallel.map([1,2,3,4,5,6,7,8,9], :in_threads=>4){|x| x+2 }.should == [3,4,5,6,7,8,9,10,11]
177
- end
178
-
179
- it 'supports all Enumerable-s' do
180
- `ruby spec/cases/parallel_map_range.rb`.should == '[1, 2, 3, 4, 5]'
181
- end
182
-
183
- it 'handles nested arrays and nil correctly' do
184
- `ruby spec/cases/map_with_nested_arrays_and_nil.rb`.should == '[nil, [2, 2], [[3], [3]]]'
185
- end
186
-
187
- it 'stops all workers when one fails in process' do
188
- `ruby spec/cases/map_with_processes_and_exceptions.rb 2>&1`.should =~ /^\d{4} raised$/
189
- end
190
-
191
- it 'stops all workers when one fails in thread' do
192
- `ruby spec/cases/map_with_threads_and_exceptions.rb 2>&1`.should =~ /^\d{0,4} raised$/
193
- end
194
-
195
- it 'stops all workers when one raises Break in process' do
196
- `ruby spec/cases/map_with_processes_and_break.rb 2>&1`.should =~ /^\d{4} Parallel::Break raised - result nil$/
197
- end
198
-
199
- it 'stops all workers when one raises Break in thread' do
200
- `ruby spec/cases/map_with_threads_and_break.rb 2>&1`.should =~ /^\d{4} Parallel::Break raised - result nil$/
201
- end
202
-
203
- it "can run with 0 threads" do
204
- Thread.should_not_receive(:exclusive)
205
- Parallel.map([1,2,3,4,5,6,7,8,9], :in_threads => 0){|x| x+2 }.should == [3,4,5,6,7,8,9,10,11]
206
- end
207
-
208
- it "can run with 0 processes" do
209
- Process.should_not_receive(:fork)
210
- Parallel.map([1,2,3,4,5,6,7,8,9], :in_processes => 0){|x| x+2 }.should == [3,4,5,6,7,8,9,10,11]
211
- end
212
-
213
- it "notifies when an item of work is dispatched to a worker process" do
214
- monitor = double('monitor', :call => nil)
215
- monitor.should_receive(:call).once.with(:first, 0)
216
- monitor.should_receive(:call).once.with(:second, 1)
217
- monitor.should_receive(:call).once.with(:third, 2)
218
- Parallel.map([:first, :second, :third], :start => monitor, :in_processes => 3) {}
219
- end
220
-
221
- it "notifies when an item of work is completed by a worker process" do
222
- monitor = double('monitor', :call => nil)
223
- monitor.should_receive(:call).once.with(:first, 0)
224
- monitor.should_receive(:call).once.with(:second, 1)
225
- monitor.should_receive(:call).once.with(:third, 2)
226
- Parallel.map([:first, :second, :third], :finish => monitor, :in_processes => 3) {}
227
- end
228
-
229
- it "notifies when an item of work is dispatched to a threaded worker" do
230
- monitor = double('monitor', :call => nil)
231
- monitor.should_receive(:call).once.with(:first, 0)
232
- monitor.should_receive(:call).once.with(:second, 1)
233
- monitor.should_receive(:call).once.with(:third, 2)
234
- Parallel.map([:first, :second, :third], :start => monitor, :in_threads => 3) {}
235
- end
236
-
237
- it "notifies when an item of work is completed by a threaded worker" do
238
- monitor = double('monitor', :call => nil)
239
- monitor.should_receive(:call).once.with(:first, 0)
240
- monitor.should_receive(:call).once.with(:second, 1)
241
- monitor.should_receive(:call).once.with(:third, 2)
242
- Parallel.map([:first, :second, :third], :finish => monitor, :in_threads => 3) {}
243
- end
244
-
245
- it "spits out a useful error when a worker dies before read" do
246
- `ruby spec/cases/map_with_killed_worker_before_read.rb 2>&1`.should include "DEAD"
247
- end
248
-
249
- it "spits out a useful error when a worker dies before write" do
250
- `ruby spec/cases/map_with_killed_worker_before_write.rb 2>&1`.should include "DEAD"
251
- end
252
- end
253
-
254
- describe ".map_with_index" do
255
- it "yields object and index" do
256
- `ruby spec/cases/map_with_index.rb 2>&1`.should == 'a0b1'
257
- end
258
-
259
- it "does not crash with empty set" do
260
- `ruby spec/cases/map_with_index_empty.rb 2>&1`.should == ''
261
- end
262
-
263
- it "can run with 0 threads" do
264
- Thread.should_not_receive(:exclusive)
265
- Parallel.map_with_index([1,2,3,4,5,6,7,8,9], :in_threads => 0){|x,i| x+2 }.should == [3,4,5,6,7,8,9,10,11]
266
- end
267
-
268
- it "can run with 0 processes" do
269
- Process.should_not_receive(:fork)
270
- Parallel.map_with_index([1,2,3,4,5,6,7,8,9], :in_processes => 0){|x,i| x+2 }.should == [3,4,5,6,7,8,9,10,11]
271
- end
272
- end
273
-
274
- describe ".each" do
275
- it "returns original array, works like map" do
276
- `ruby spec/cases/each.rb`.should == 'a b c d'
277
- end
278
-
279
- it "does not use marshal_dump" do
280
- `ruby spec/cases/no_dump_with_each.rb 2>&1`.should == 'no dump for resultno dump for each'
281
- end
282
-
283
- it "does not slow down with lots of GC work in threads" do
284
- Benchmark.realtime { `ruby spec/cases/no_gc_with_each.rb 2>&1` }.should <= 10
285
- end
286
- end
287
-
288
- describe ".each_with_index" do
289
- it "yields object and index" do
290
- ["a0b1", "b1a0"].should include `ruby spec/cases/each_with_index.rb 2>&1`
291
- end
292
- end
293
- end
data/spec/spec_helper.rb DELETED
@@ -1,2 +0,0 @@
1
- require 'parallel'
2
- require 'benchmark'