in-parallel 0.1.11 → 0.1.12

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ecbae8756fd4310b2b2330b342f7ada3ee48dae6
4
- data.tar.gz: c42d6e4ffb5d87d1418d9bccbc65c4ec3347f5b5
3
+ metadata.gz: 71e83d885d72ee9199c9012d190f11c0e4fb7a23
4
+ data.tar.gz: 62274a9de6e81cd4772ce775904e49e9340b0346
5
5
  SHA512:
6
- metadata.gz: 0510bb42cb5342dee946b5f383acd9da2c0277bc60c466c80f17ab10b7f243d34672868c2f95c36525781a6fe95c7d47e52bb4003c6d64d67886201b832aaf3c
7
- data.tar.gz: 30d1528fa0ce04a39636f10c0e3e969315e5c679ada2b763f8b0046a802ee7a15c5d1bd6abcb61aa8a60b63a2e39cea44c706b60cb17d36f40e03f2d635d10f0
6
+ metadata.gz: a21762fb62f58b8a4b4eda90123bbefb41ed0dc078c07239b18a2ec2ba33b43ca5aadc10d99a8d7034ce31ffa662da081c8dbfc9a5030c45614160433c6a1a0e
7
+ data.tar.gz: dae9561fa380ebcfcbac4ea677fb44878b30d7248f389180578a089243fa3731e9ed815e666ae64bd4337edbf30fbd1e9475b6ffe52c26dd21ba4bf0922a709d
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  "processes if you try to spin up a LOT of processes. If you're looking for something simple and " +
22
22
  "light-weight and on either linux or mac (forking processes is not supported on Windows), then this " +
23
23
  "solution could be what you want."
24
- spec.homepage = "https://github.com/samwoods1/in-parallel"
24
+ spec.homepage = "https://github.com/puppetlabs/in-parallel"
25
25
  spec.license = "MIT"
26
26
 
27
27
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
@@ -1,3 +1,3 @@
1
1
  module InParallel
2
- VERSION = Version = '0.1.11'
2
+ VERSION = Version = '0.1.12'
3
3
  end
@@ -104,9 +104,11 @@ module InParallel
104
104
  def self.wait_for_processes(proxy = self, binding = nil, timeout = nil, kill_all_on_error = false)
105
105
  raise_error = nil
106
106
  timeout ||= @@parallel_default_timeout
107
+ send_int = false
107
108
  trap(:INT) do
108
109
  # Can't use logger inside of trap
109
110
  puts "Warning, recieved interrupt. Processing child results and exiting."
111
+ send_int = true
110
112
  kill_child_processes
111
113
  end
112
114
  return unless Process.respond_to?(:fork)
@@ -170,18 +172,18 @@ module InParallel
170
172
  @@background_objs.each { |obj| result_lookup(obj[:proxy], obj[:target], results_map) }
171
173
  @@background_objs.clear
172
174
 
175
+ Process.kill("INT", Process.pid) if send_int
173
176
  raise raise_error unless raise_error.nil?
174
-
175
177
  return results
176
178
  end
177
179
 
178
- # private method to execute some code in a separate process and store the STDOUT and STDERR for later retrieval
180
+ # private method to execute a block of code in a separate process and store the STDOUT and return value for later retrieval
179
181
  def self._execute_in_parallel(method_sym, obj = self, &block)
180
182
  ret_val = nil
181
183
  # Communicate the return value of the method or block
182
184
  read_result, write_result = IO.pipe
185
+ Dir.mkdir('tmp') unless Dir.exists? 'tmp'
183
186
  pid = fork do
184
- Dir.mkdir('tmp') unless Dir.exists? 'tmp'
185
187
  stdout_file = File.new("tmp/pp_#{Process.pid}", 'w')
186
188
  exit_status = 0
187
189
  trap(:INT) do
@@ -201,26 +203,17 @@ module InParallel
201
203
  # close subprocess's copy of read_result since it only needs to write
202
204
  read_result.close
203
205
  ret_val = obj.instance_eval(&block)
204
- # Write the result to the write_result IO stream.
205
- # Have to serialize the value so it can be transmitted via IO
206
- if (!ret_val.nil? && ret_val.singleton_methods && ret_val.class != TrueClass && ret_val.class != FalseClass && ret_val.class != Fixnum)
207
- #in case there are other types that can't be duped
208
- begin
209
- ret_val = ret_val.dup
210
- rescue StandardError => err
211
- @@logger.warn "Warning: return value from child process #{ret_val} " +
212
- "could not be transferred to parent process: #{err.message}"
213
- end
214
- end
206
+ ret_val = strip_singleton(ret_val)
215
207
  # In case there are other types that can't be dumped
216
208
  begin
209
+ # Write the result to the write_result IO stream.
217
210
  Marshal.dump(ret_val, write_result) unless ret_val.nil?
218
211
  rescue StandardError => err
219
212
  @@logger.warn "Warning: return value from child process #{ret_val} " +
220
213
  "could not be transferred to parent process: #{err.message}"
221
214
  end
222
215
  rescue Exception => err
223
- @@logger.error "Error in process #{pid}: #{err.message}"
216
+ @@logger.error "Error in process #{Process.pid}: #{err.message}"
224
217
  # Return the error if an error is rescued so we can re-throw in the main process.
225
218
  Marshal.dump(err, write_result)
226
219
  exit_status = 1
@@ -264,9 +257,27 @@ module InParallel
264
257
  end
265
258
  end
266
259
  end
267
-
268
260
  private_class_method :kill_child_processes
269
261
 
262
+ def self.strip_singleton(obj)
263
+ unless (obj.nil? || obj.singleton_methods.empty?)
264
+ obj = obj.dup
265
+ end
266
+ begin
267
+ obj.singleton_class.class_eval do
268
+ instance_variables.each { |v| instance_eval("remove_instance_variable(:#{v})") }
269
+ end
270
+ rescue TypeError # if no singleton_class exists for the object it raises a TypeError
271
+ end
272
+
273
+ # Recursively check any objects assigned to instance variables for singleton methods, or variables
274
+ obj.instance_variables.each do |v|
275
+ obj.instance_variable_set(v, strip_singleton(obj.instance_variable_get(v)))
276
+ end
277
+ obj
278
+ end
279
+ private_class_method :strip_singleton
280
+
270
281
  # Private method to lookup results from the results_map and replace the
271
282
  # temp values with actual return values
272
283
  def self.result_lookup(proxy_obj, target_obj, results_map)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: in-parallel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - samwoods1
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-29 00:00:00.000000000 Z
11
+ date: 2016-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -67,7 +67,7 @@ files:
67
67
  - lib/in_parallel.rb
68
68
  - lib/parallel_enumerable.rb
69
69
  - lib/parallel_logger.rb
70
- homepage: https://github.com/samwoods1/in-parallel
70
+ homepage: https://github.com/puppetlabs/in-parallel
71
71
  licenses:
72
72
  - MIT
73
73
  metadata: {}