team_effort 0.0.3 → 0.0.9

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
- 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