team_effort 0.0.3 → 0.0.9

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
- SHA1:
3
- metadata.gz: 75c7884021dc7ff32714dd57b1d642ba110817a4
4
- data.tar.gz: 0129f103f4db6e91a423dab711c9de64c7094dfb
2
+ SHA256:
3
+ metadata.gz: 267e445b9850df939f36b9458ed000f4889867bc3c686fb4410b5e6acf2d6f31
4
+ data.tar.gz: 0a6673448d5e06aa98d7e760c6df4e773008747241e7012a7217c37357e9fcee
5
5
  SHA512:
6
- metadata.gz: 42c57584ea793a16e6888535e29e94ac44aeb4a1a580c001cc4ec48e53b4f4637411bb8584b87c0e7d7e2c838673aa2eb5c733620fc26cd163575d08af4cd642
7
- data.tar.gz: 5ff868836356131210df02424b805807cf04bba59a9e717c1340de88248faa724c640b830fef13b05ed91320d83465331e13ad94d127cbdb0de6bc17a1237529
6
+ metadata.gz: d60080c326dd3acbe4e2886d858919e92e01c94e9aa6fa629ffca35829d27868eb674d49bf572fae5bcf9c26939a1ed40047333eb5d122b01b51e864bcfd0b8c
7
+ data.tar.gz: d1c1a4f3f6ff5fd9b0539df97487d02d5576278c770cab598d26799d81185c61b852f013ada2963167953bf3391f1c675954fc6896d191d923cd73fd24a16b54
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ .idea
@@ -1 +1 @@
1
- ruby-2.0.0-p247
1
+ ruby-2.4.4
data/README.md CHANGED
@@ -51,9 +51,19 @@ You may specify the number of child processes with the work method:
51
51
  # do some work on item
52
52
  end
53
53
  ```
54
-
55
54
  The number of child processes defaults to 4.
56
55
 
56
+ You can pass in a proc to receive completion notifications.
57
+
58
+ ```irb
59
+ > data = %w|one two three|
60
+ > progress_proc = ->(index, max_index) { puts "#{ sprintf("%3i%", index.to_f / max_index * 100) }" }
61
+ > TeamEffort.work(data, 1, progress_proc: progress_proc) {}
62
+ 33%
63
+ 66%
64
+ 100%
65
+ ```
66
+
57
67
  In rails you need to reestablish your ActiveRecord connection in the
58
68
  child process:
59
69
 
@@ -72,19 +82,6 @@ child process:
72
82
  end
73
83
  ```
74
84
 
75
- Logging can be messy when multiple processes are writing to the same
76
- io channel. One approach is to wrap logging statements in a
77
- synchronize block:
78
-
79
- ```ruby
80
- def pid_logger(msg)
81
- @mutex ||= Mutex.new
82
- @mutex.synchronize do
83
- puts "[#{Process.pid} at #{Time.now.strftime('%H:%M:%S')}] #{msg}"
84
- end
85
- end
86
- ```
87
-
88
85
  ## Discussion
89
86
 
90
87
  TeamEffort uses child processes to do concurrent processing. To review
@@ -1,13 +1,16 @@
1
1
  require_relative "team_effort/version"
2
2
 
3
3
  module TeamEffort
4
- def self.work(enumerable, max_process_count = 4)
4
+ def self.work(enumerable, max_process_count = 4, progress_proc: nil)
5
5
  pids = []
6
+ max_count = enumerable.count
7
+ completed_count = 0
6
8
 
7
9
  enumerable.each do |args|
8
10
  while pids.size == max_process_count
9
11
  finished_pid = Process.wait
10
12
  pids.delete finished_pid
13
+ progress_proc.call(completed_count += 1, max_count) if progress_proc
11
14
  end
12
15
 
13
16
  pids << fork do
@@ -18,6 +21,7 @@ module TeamEffort
18
21
  while !pids.empty?
19
22
  finished_pid = Process.wait
20
23
  pids.delete finished_pid
24
+ progress_proc.call(completed_count += 1, max_count) if progress_proc
21
25
  end
22
26
  end
23
27
  end
@@ -1,3 +1,3 @@
1
1
  module TeamEffort
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -30,6 +30,19 @@ describe TeamEffort do
30
30
  end
31
31
  end
32
32
 
33
+ it 'invokes an optional proc when it completes an item' do
34
+ data = %w|one two three|
35
+ proc_data = []
36
+ # proc = ->(item_index, max_items) {proc_data << [item_index, max_items]}
37
+ progress_proc = ->(index, max_index) { puts "#{ sprintf("%3i%", index.to_f / max_index * 100) }" }
38
+ TeamEffort.work(data, 1, progress_proc: progress_proc) {}
39
+
40
+ proc_data.must_equal [
41
+ [1, 3],
42
+ [2, 3],
43
+ [3, 3],
44
+ ]
45
+ end
33
46
 
34
47
  it 'ignores other child process completions' do
35
48
  output_io_class = Class.new do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: team_effort
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Felkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-29 00:00:00.000000000 Z
11
+ date: 2018-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -76,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
76
  version: '0'
77
77
  requirements: []
78
78
  rubyforge_project:
79
- rubygems_version: 2.4.3
79
+ rubygems_version: 2.7.7
80
80
  signing_key:
81
81
  specification_version: 4
82
82
  summary: Use child processes to process a collection in parallel