parallel 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 05382db7d0b4b4f68df10928de7361d70ccac05f
4
- data.tar.gz: 5e2ad497c0cd970096597b55463dc8537eb28a13
3
+ metadata.gz: 1cfb32f76c7f232bcd3f44e8370af1e61882de3a
4
+ data.tar.gz: edab2b1cf2013b37cb7a58908750bfb1221327a8
5
5
  SHA512:
6
- metadata.gz: 95cd753742bca781538717f438151e16088fa4a952e75047654731e38b53a6beaf6d551ead69c332f6d1f7563d83dfae5e4b5b34138dceb14a944e3c0804d935
7
- data.tar.gz: f13c32555e567c9a14f61a3315cb2b90a353d3f8fa6022ff1a7735e66de189b303592c400d11fa34610544a898e200e75df23dac719d5fcd44a9230be52dc6fe
6
+ metadata.gz: 99aa1aaefc20811d7540d607521f76b0edf10b09f5e96d1997341b5a12305d136355ae62e54380d5095111840d2258f8aa09e7a36abff52fdd79cb8f3d392c30
7
+ data.tar.gz: 3f4255effe94025fa160ec1ef0f47a1a319c7036a4910f762b95218a7ddcc7b118edc60fb884b2ba8af39959e6b74b51d7b16d1dd8d235ed89ec28505997019f
@@ -35,15 +35,16 @@ module Parallel
35
35
  @read, @write, @pid = read, write, pid
36
36
  end
37
37
 
38
- def close_pipes
39
- read.close
40
- write.close
38
+ def stop
39
+ close_pipes
40
+ wait # if it goes zombie, rather wait here to be able to debug
41
41
  end
42
42
 
43
- def wait
44
- Process.wait(pid)
45
- rescue Interrupt
46
- # process died
43
+ # might be passed to started_processes and simultaneously closed by another thread
44
+ # when running in isolation mode, so we have to check if it is closed before closing
45
+ def close_pipes
46
+ read.close unless read.closed?
47
+ write.close unless write.closed?
47
48
  end
48
49
 
49
50
  def work(data)
@@ -61,6 +62,14 @@ module Parallel
61
62
  raise result.exception if ExceptionWrapper === result
62
63
  result
63
64
  end
65
+
66
+ private
67
+
68
+ def wait
69
+ Process.wait(pid)
70
+ rescue Interrupt
71
+ # process died
72
+ end
64
73
  end
65
74
 
66
75
  class JobFactory
@@ -300,7 +309,11 @@ module Parallel
300
309
  end
301
310
 
302
311
  def work_in_processes(job_factory, options, &blk)
303
- workers = create_workers(job_factory, options, &blk)
312
+ workers = if options[:isolation]
313
+ [] # we create workers per job and not beforehand
314
+ else
315
+ create_workers(job_factory, options, &blk)
316
+ end
304
317
  results = []
305
318
  results_mutex = Mutex.new # arrays are not thread-safe
306
319
  exception = nil
@@ -308,7 +321,6 @@ module Parallel
308
321
  UserInterruptHandler.kill_on_ctrl_c(workers.map(&:pid), options) do
309
322
  in_threads(options) do |i|
310
323
  worker = workers[i]
311
- worker.thread = Thread.current
312
324
 
313
325
  begin
314
326
  loop do
@@ -316,6 +328,12 @@ module Parallel
316
328
  item, index = job_factory.next
317
329
  break unless index
318
330
 
331
+ if options[:isolation]
332
+ worker = replace_worker(job_factory, workers, i, options, blk)
333
+ end
334
+
335
+ worker.thread = Thread.current
336
+
319
337
  begin
320
338
  result = with_instrumentation item, index, options do
321
339
  worker.work(job_factory.pack(item, index))
@@ -332,8 +350,7 @@ module Parallel
332
350
  end
333
351
  end
334
352
  ensure
335
- worker.close_pipes
336
- worker.wait # if it goes zombie, rather wait here to be able to debug
353
+ worker.stop if worker
337
354
  end
338
355
  end
339
356
  end
@@ -341,6 +358,16 @@ module Parallel
341
358
  handle_exception(exception, results)
342
359
  end
343
360
 
361
+ def replace_worker(job_factory, workers, i, options, blk)
362
+ # old worker is no longer used ... stop it
363
+ worker = workers[i]
364
+ worker.stop if worker
365
+
366
+ # create a new replacement worker
367
+ running = workers - [worker]
368
+ workers[i] = worker(job_factory, options.merge(started_workers: running), &blk)
369
+ end
370
+
344
371
  def create_workers(job_factory, options, &block)
345
372
  workers = []
346
373
  Array.new(options[:count]).each do
@@ -1,3 +1,3 @@
1
1
  module Parallel
2
- VERSION = Version = '1.7.0'
2
+ VERSION = Version = '1.8.0'
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: 1.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-25 00:00:00.000000000 Z
11
+ date: 2016-03-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: michael@grosser.it