process-group 1.0.0 → 1.0.1
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 +4 -4
- data/.rspec +2 -0
- data/.travis.yml +10 -3
- data/README.md +2 -0
- data/lib/process/group.rb +15 -7
- data/lib/process/group/version.rb +1 -1
- data/process-group.gemspec +2 -2
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28a68aa53cd296412dd77cdca5a9c8b000269439
|
4
|
+
data.tar.gz: 49777327e43bbddda6e17a2b13776227693d115d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 508765b5658d4fbb032c7f43f36a5a9c26e4fbbfc379295398d3ac08e9da12bab9440cb9002bd052d9eaaba5abbbd9ee970f8a290ceaab144ad682e53e95ebfb
|
7
|
+
data.tar.gz: 0f7d655bd81259b92c757342ff71aee743209e33dbb3c1a71e4b4facd0c4dac5de706a01735c4afd964feb6b52429e8d6b07e706db992408a7da81f599b5a4e9
|
data/.rspec
ADDED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -5,6 +5,8 @@
|
|
5
5
|
[](http://travis-ci.org/ioquatix/process-group)
|
6
6
|
[](https://codeclimate.com/github/ioquatix/process-group)
|
7
7
|
[](https://coveralls.io/r/ioquatix/process-group)
|
8
|
+
[](http://www.rubydoc.info/gems/process-group)
|
9
|
+
[](https://github.com/ioquatix/process-group)
|
8
10
|
|
9
11
|
## Installation
|
10
12
|
|
data/lib/process/group.rb
CHANGED
@@ -23,6 +23,7 @@ require 'fiber'
|
|
23
23
|
module Process
|
24
24
|
# A group of tasks which can be run asynchrnously using fibers. Someone must call Group#wait to ensure that all fibers eventually resume.
|
25
25
|
class Group
|
26
|
+
# Executes a command using Process.spawn with the given arguments and options.
|
26
27
|
class Command
|
27
28
|
def initialize(arguments, options, fiber = Fiber.current)
|
28
29
|
@arguments = arguments
|
@@ -45,6 +46,7 @@ module Process
|
|
45
46
|
end
|
46
47
|
end
|
47
48
|
|
49
|
+
# Runs a given block using a forked process.
|
48
50
|
class Fork
|
49
51
|
def initialize(block, options, fiber = Fiber.current)
|
50
52
|
@options = options
|
@@ -73,8 +75,10 @@ module Process
|
|
73
75
|
end
|
74
76
|
end
|
75
77
|
|
76
|
-
# Create a new process group. Can specify `
|
78
|
+
# Create a new process group. Can specify `limit:` which limits the maximum number of concurrent processes.
|
77
79
|
def initialize(limit: nil)
|
80
|
+
raise ArgumentError.new("Limit must be nil (unlimited) or > 0") unless limit == nil or limit > 0
|
81
|
+
|
78
82
|
@pid = Process.pid
|
79
83
|
|
80
84
|
@queue = []
|
@@ -99,11 +103,12 @@ module Process
|
|
99
103
|
-@pgid
|
100
104
|
end
|
101
105
|
|
106
|
+
# Are there processes currently running?
|
102
107
|
def running?
|
103
108
|
@running.size > 0
|
104
109
|
end
|
105
110
|
|
106
|
-
# Run a process, arguments have same meaning as Process#spawn.
|
111
|
+
# Run a process in a new fiber, arguments have same meaning as Process#spawn.
|
107
112
|
def run(*arguments)
|
108
113
|
Fiber.new do
|
109
114
|
exit_status = self.spawn(*arguments)
|
@@ -112,15 +117,17 @@ module Process
|
|
112
117
|
end.resume
|
113
118
|
end
|
114
119
|
|
120
|
+
# Run a specific command as a child process.
|
115
121
|
def spawn(*arguments, **options)
|
116
122
|
append! Command.new(arguments, options)
|
117
123
|
end
|
118
124
|
|
125
|
+
# Fork a block as a child process.
|
119
126
|
def fork(**options, &block)
|
120
127
|
append! Fork.new(block, options)
|
121
128
|
end
|
122
129
|
|
123
|
-
# Whether
|
130
|
+
# Whether or not #spawn, #fork or #run can be scheduled immediately.
|
124
131
|
def available?
|
125
132
|
if @limit
|
126
133
|
@running.size < @limit
|
@@ -129,12 +136,12 @@ module Process
|
|
129
136
|
end
|
130
137
|
end
|
131
138
|
|
132
|
-
# Whether or not calling run would block the caller.
|
139
|
+
# Whether or not calling #spawn, #fork or #run would block the caller fiber (i.e. call Fiber.yield).
|
133
140
|
def blocking?
|
134
141
|
not available?
|
135
142
|
end
|
136
143
|
|
137
|
-
# Wait for all processes to finish
|
144
|
+
# Wait for all running and queued processes to finish.
|
138
145
|
def wait
|
139
146
|
raise ArgumentError.new("Cannot call Process::Group#wait from child process!") unless @pid == Process.pid
|
140
147
|
|
@@ -168,8 +175,8 @@ module Process
|
|
168
175
|
wait_all
|
169
176
|
end
|
170
177
|
|
171
|
-
# Send a signal to all processes.
|
172
|
-
def kill(signal)
|
178
|
+
# Send a signal to all currently running processes. No-op unless #running?
|
179
|
+
def kill(signal = :INT)
|
173
180
|
if running?
|
174
181
|
Process.kill(signal, id)
|
175
182
|
end
|
@@ -177,6 +184,7 @@ module Process
|
|
177
184
|
|
178
185
|
private
|
179
186
|
|
187
|
+
# Append a process to the queue and schedule it for execution if possible.
|
180
188
|
def append!(process)
|
181
189
|
@queue << process
|
182
190
|
|
data/process-group.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
Manages a unix process group for running multiple processes, keeps track of multiple processes and leverages fibers to provide predictable behaviour in complicated process-based scripts.
|
13
13
|
EOF
|
14
14
|
spec.summary = %q{Run processes concurrently in separate fibers with predictable behaviour.}
|
15
|
-
spec.homepage = ""
|
15
|
+
spec.homepage = "https://github.com/ioquatix/process-group"
|
16
16
|
spec.license = "MIT"
|
17
17
|
|
18
18
|
spec.files = `git ls-files`.split($/)
|
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.required_ruby_version = '>= 2.0'
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
26
|
-
spec.add_development_dependency "rspec", "~> 3.
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.4.0"
|
27
27
|
spec.add_development_dependency "rake"
|
28
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: process-group
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.
|
33
|
+
version: 3.4.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 3.
|
40
|
+
version: 3.4.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -62,6 +62,7 @@ extensions: []
|
|
62
62
|
extra_rdoc_files: []
|
63
63
|
files:
|
64
64
|
- ".gitignore"
|
65
|
+
- ".rspec"
|
65
66
|
- ".simplecov"
|
66
67
|
- ".travis.yml"
|
67
68
|
- Gemfile
|
@@ -77,7 +78,7 @@ files:
|
|
77
78
|
- spec/process/group/load_spec.rb
|
78
79
|
- spec/process/group/process_spec.rb
|
79
80
|
- spec/process/group/spawn_spec.rb
|
80
|
-
homepage:
|
81
|
+
homepage: https://github.com/ioquatix/process-group
|
81
82
|
licenses:
|
82
83
|
- MIT
|
83
84
|
metadata: {}
|
@@ -97,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
98
|
version: '0'
|
98
99
|
requirements: []
|
99
100
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.
|
101
|
+
rubygems_version: 2.4.6
|
101
102
|
signing_key:
|
102
103
|
specification_version: 4
|
103
104
|
summary: Run processes concurrently in separate fibers with predictable behaviour.
|