parallel-forkmanager 1.0.1 → 2.0.6

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.
@@ -0,0 +1,30 @@
1
+ module Parallel
2
+ class ForkManager
3
+ ##
4
+ # This class lets us build a dummy exit status which can be used where we
5
+ # expect a Process::Status.
6
+ class DummyProcessStatus
7
+ ##
8
+ # @param exitstatus [Integer] The exit status we want to simulate.
9
+ def initialize(exitstatus = 0)
10
+ @exitstatus = (Integer(exitstatus) & 0x37)
11
+ end
12
+
13
+ ##
14
+ # @return [Integer]
15
+ attr_reader :exitstatus
16
+
17
+ ##
18
+ # @return [nil]
19
+ def stopsig
20
+ nil
21
+ end
22
+
23
+ ##
24
+ # @return [false]
25
+ def coredump?
26
+ false
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ module Parallel
2
+ class ForkManager
3
+ ##
4
+ # The class from which all of {Parallel::ForkManager}'s error exceptions
5
+ # should inherit. This makes rescuing them easier.
6
+ class Error < RuntimeError; end
7
+
8
+ ##
9
+ # Raised when an unknown type of serialization is requested.
10
+ class UnknownSerializerError < Error; end
11
+
12
+ ##
13
+ # Raised when the specified temporary directory isn't a directory.
14
+ class MissingTempDirError < Error; end
15
+
16
+ ##
17
+ # Raised when we call +start+ in a child process.
18
+ class AttemptedStartInChildProcessError; end
19
+ end
20
+ end
@@ -0,0 +1,51 @@
1
+ require "English"
2
+ require "forwardable"
3
+
4
+ module Parallel
5
+ class ForkManager
6
+ ##
7
+ # This module defines an interface to +fork+ & +waitpid+ so that there is a
8
+ # good "seam" at which to mock.
9
+ #
10
+ # {Parallel::ForkManager::ProcessInterface} adds a process_interface
11
+ # attribute and delegates fork, child_status, and waitpid to it as private
12
+ # methods.
13
+ module ProcessInterface
14
+ extend Forwardable
15
+
16
+ attr_reader :process_interface
17
+ private :process_interface
18
+
19
+ # Not quite sure why fork can't be delegated successfully.
20
+ def fork(*args, &block)
21
+ process_interface.fork(*args, &block)
22
+ end
23
+ private :fork
24
+
25
+ def_delegators :@process_interface, :child_status, :waitpid
26
+ private :child_status, :waitpid
27
+
28
+ ##
29
+ # A Parallel::ProcessInterface::Instance is something we can delegate to.
30
+ class Instance
31
+ ##
32
+ # Calls Kernel.fork and returns its return value.
33
+ def fork(*args, &block)
34
+ Kernel.fork(*args, &block)
35
+ end
36
+
37
+ ##
38
+ # Calls Process.waitpid and returns its return value.
39
+ def waitpid(*args)
40
+ Process.waitpid(*args)
41
+ end
42
+
43
+ ##
44
+ # @return [Process::Status] the child's process status.
45
+ def child_status
46
+ $CHILD_STATUS
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,59 @@
1
+ require "yaml"
2
+ require_relative "error"
3
+
4
+ module Parallel
5
+ class ForkManager
6
+ # TODO: Maybe make this into a factory, given the number of case statements
7
+ # switching on type. This is a "shameless green" if you use Sandi Metz's
8
+ # terminology.
9
+ class Serializer
10
+ ##
11
+ # Raises a {Parallel::ForkManager::UnknownSerializerError} exception if
12
+ # +type+ isn't one of +marshal+ or +yaml+
13
+ #
14
+ # @param type [String] The type of serialization to use.
15
+ def initialize(type)
16
+ @type = validate_type(type)
17
+ end
18
+
19
+ ##
20
+ # @param data_structure [Object] the data to be serialized.
21
+ # @return [String] the serialized representation of the data.
22
+ def serialize(data_structure)
23
+ case type
24
+ when :marshal
25
+ Marshal.dump(data_structure)
26
+ when :yaml
27
+ YAML.dump(data_structure)
28
+ end
29
+ end
30
+
31
+ ##
32
+ # @param serialized [String] the serialized representation of the data.
33
+ # @return [Object] the resonstituted data structure.
34
+ def deserialize(serialized)
35
+ case type
36
+ when :marshal
37
+ Marshal.load(serialized)
38
+ when :yaml
39
+ YAML.load(serialized)
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ attr_reader :type
46
+
47
+ def validate_type(t)
48
+ case t.downcase
49
+ when "marshal"
50
+ :marshal
51
+ when "yaml"
52
+ :yaml
53
+ else
54
+ fail Parallel::ForkManager::UnknownSerializerError
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,8 @@
1
+ module Parallel
2
+ class ForkManager
3
+ ##
4
+ # This is the version of the Parallel::ForkManager, used in the library and
5
+ # in the rake task for packaging.
6
+ VERSION = "2.0.6"
7
+ end
8
+ end
@@ -0,0 +1,32 @@
1
+ require "pathname"
2
+ lib = (Pathname(__FILE__).dirname + "lib").to_s
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "parallel/forkmanager/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.platform = Gem::Platform::RUBY
8
+ s.name = "parallel-forkmanager"
9
+ s.version = Parallel::ForkManager::VERSION
10
+ s.author = "Nathan Patwardhan"
11
+ s.homepage = "https://github.com/npatwardhan/ruby-parallel-forkmanager/"
12
+ s.email = "noopy.org<at>gmail.com"
13
+ s.description = <<-ETX
14
+ A simple parallel processing fork manager, based on the Perl module.
15
+ ETX
16
+ s.license = "Ruby"
17
+ s.summary = "A simple parallel processing fork manager."
18
+
19
+ s.files = `git ls-files -z`.split("\x0")
20
+ .reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ s.bindir = "bin"
22
+ s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+
25
+ # recommended versions commented out because we are testing against some
26
+ # older rubies...
27
+ s.add_development_dependency "bundler" # , "~> 1.9"
28
+ s.add_development_dependency "rake" # , "~> 10.0"
29
+ s.add_development_dependency "minitest"
30
+ s.add_development_dependency "pry"
31
+ s.add_development_dependency "yard"
32
+ end
metadata CHANGED
@@ -1,55 +1,134 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: parallel-forkmanager
3
- version: !ruby/object:Gem::Version
4
- version: 1.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.6
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Nathan Patwardhan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
+ date: 2020-05-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: 'A simple parallel processing fork manager, based on the Perl module.
11
84
 
12
- date: 2009-10-24 00:00:00 -04:00
13
- default_executable:
14
- dependencies: []
15
-
16
- description:
17
- email: noopy.org @nospam@ gmail.com
85
+ '
86
+ email: noopy.org<at>gmail.com
18
87
  executables: []
19
-
20
88
  extensions: []
21
-
22
89
  extra_rdoc_files: []
23
-
24
- files:
90
+ files:
91
+ - ".gitignore"
92
+ - ".rubocop.yml"
93
+ - ".travis.yml"
94
+ - CHANGELOG.md
95
+ - EXAMPLES.yard
96
+ - Gemfile
97
+ - README.md
98
+ - Rakefile
99
+ - examples/callbacks.rb
100
+ - examples/data_structures_advanced.rb
101
+ - examples/data_structures_string.rb
102
+ - examples/parallel_http_get.rb
103
+ - examples/use_pfm.rb
25
104
  - lib/parallel/forkmanager.rb
26
- - use_pfm.rb
27
- - parallel_http_get.rb
28
- has_rdoc: true
29
- homepage: http://rubyforge.org/projects/parallelforkmgr/
105
+ - lib/parallel/forkmanager/dummy_process_status.rb
106
+ - lib/parallel/forkmanager/error.rb
107
+ - lib/parallel/forkmanager/process_interface.rb
108
+ - lib/parallel/forkmanager/serializer.rb
109
+ - lib/parallel/forkmanager/version.rb
110
+ - parallel-forkmanager.gemspec
111
+ homepage: https://github.com/npatwardhan/ruby-parallel-forkmanager/
112
+ licenses:
113
+ - Ruby
114
+ metadata: {}
30
115
  post_install_message:
31
116
  rdoc_options: []
32
-
33
- require_paths:
34
- - lib/parallel
35
- required_ruby_version: !ruby/object:Gem::Requirement
36
- requirements:
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
37
121
  - - ">="
38
- - !ruby/object:Gem::Version
39
- version: "0"
40
- version:
41
- required_rubygems_version: !ruby/object:Gem::Requirement
42
- requirements:
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
43
126
  - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
46
- version:
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
47
129
  requirements: []
48
-
49
- rubyforge_project: parallelforkmgr
50
- rubygems_version: 1.3.1
130
+ rubygems_version: 3.0.3
51
131
  signing_key:
52
- specification_version: 2
132
+ specification_version: 4
53
133
  summary: A simple parallel processing fork manager.
54
134
  test_files: []
55
-
@@ -1,53 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'net/http'
4
- require 'lib/parallel/forkmanager'
5
-
6
- save_dir = '/tmp'
7
-
8
- my_urls = [
9
- 'http://www.cnn.com/index.html',
10
- 'http://www.oreilly.com/index.html',
11
- 'http://www.cakewalk.com/index.html',
12
- 'http://www.asdfsemicolonl.kj/index.htm'
13
- ]
14
-
15
- max_proc = 20
16
- pfm = Parallel::ForkManager.new(max_proc)
17
-
18
- pfm.run_on_finish(
19
- lambda {
20
- |pid,exit_code,ident|
21
- print "** PID (#{pid}) for #{ident} exited with code #{exit_code}!\n"
22
- }
23
- )
24
-
25
- for my_url in my_urls
26
- pfm.start(my_url) and next
27
-
28
- url = URI.parse(my_url)
29
-
30
- begin
31
- req = Net::HTTP::Get.new(url.path)
32
- res = Net::HTTP.start(url.host, url.port) {|http|
33
- http.request(req)
34
- }
35
- rescue
36
- pfm.finish(255)
37
- end
38
-
39
- status = res.code
40
- out_file = save_dir + '/' + url.host + '.txt';
41
-
42
- if status.to_i == 200
43
- f = File.open(out_file, 'w')
44
- f.print res.body
45
- f.close()
46
- pfm.finish(0)
47
- else
48
- pfm.finish(255)
49
- end
50
- end
51
-
52
- pfm.wait_all_children()
53
-
data/use_pfm.rb DELETED
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "lib/parallel/forkmanager"
4
-
5
- num_procs = 20
6
- pfm = Parallel::ForkManager.new(num_procs)
7
-
8
- items = 1..10
9
-
10
- pfm.run_on_start(
11
- lambda {
12
- |pid,ident|
13
- print "run on start ::: #{ident} (#{pid})\n"
14
- }
15
- )
16
-
17
- pfm.run_on_finish(
18
- lambda {
19
- |pid,exit_code,ident|
20
- print " on_finish: ** PID: #{pid} EXIT: #{exit_code} IDENT: #{ident}\n"
21
- }
22
- )
23
-
24
- timeout = 0.5
25
- pfm.run_on_wait(
26
- lambda {
27
- print "** Have to wait for one child ...\n"
28
- },
29
- timeout
30
- )
31
-
32
- for item in items
33
- my_item = 'nate-' + item.to_s
34
- pid = pfm.start(my_item) and next
35
-
36
- pfm.finish()
37
- end
38
-
39
- pfm.wait_all_children()
40
-