iprocess 2.0.2 → 2.1.0
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.
- data/README.md +18 -1
- data/lib/iprocess/channel.rb +1 -5
- data/lib/iprocess/version.rb +1 -1
- data/lib/iprocess.rb +51 -24
- metadata +32 -12
data/README.md
CHANGED
@@ -12,10 +12,14 @@ __DESCRIPTION__
|
|
12
12
|
|
13
13
|
IProcess, short for _Inter Process Communication(IPC) Process_, is a collection
|
14
14
|
of classes you can use to transport Ruby objects between processes running on
|
15
|
-
UNIX-like operating systems.
|
15
|
+
UNIX-like operating systems.
|
16
|
+
|
16
17
|
|
17
18
|
__EXAMPLES__
|
18
19
|
|
20
|
+
The first two examples(one & two) are using the synchronous APIs, a little below
|
21
|
+
those(3) demos the asynchronous API.
|
22
|
+
|
19
23
|
__1.__
|
20
24
|
|
21
25
|
A single subprocess is spawned:
|
@@ -40,6 +44,19 @@ subprocesses you can spawn is variable (5, in this example):
|
|
40
44
|
|
41
45
|
IProcess.spawn(5, Worker.new) # => [2, 2, 2, 2, 2]
|
42
46
|
|
47
|
+
__3.__
|
48
|
+
|
49
|
+
A single subprocess is spawned asynchronously.
|
50
|
+
When the subprocess completes, ':hi' is sent to `obj#recv` from another thread.
|
51
|
+
|
52
|
+
obj = Object.new
|
53
|
+
def obj.recv(msg)
|
54
|
+
msg.to_s.captialize!
|
55
|
+
end
|
56
|
+
|
57
|
+
jobs = IProcess.spawn! { :hi }
|
58
|
+
jobs.map { |job| job.defer(listener) }
|
59
|
+
|
43
60
|
|
44
61
|
__PLATFORM SUPPORT__
|
45
62
|
|
data/lib/iprocess/channel.rb
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
class IProcess::Channel
|
2
2
|
|
3
|
-
attr_reader :name
|
4
|
-
|
5
3
|
#
|
6
4
|
# @yieldparam [IProcess::Channel] _self
|
7
5
|
# Yields self.
|
8
6
|
#
|
9
|
-
def initialize
|
7
|
+
def initialize
|
10
8
|
@reader, @writer = IO.pipe
|
11
|
-
@name = name
|
12
9
|
|
13
10
|
if block_given?
|
14
11
|
yield self
|
@@ -65,4 +62,3 @@ class IProcess::Channel
|
|
65
62
|
end
|
66
63
|
|
67
64
|
end
|
68
|
-
|
data/lib/iprocess/version.rb
CHANGED
data/lib/iprocess.rb
CHANGED
@@ -1,35 +1,49 @@
|
|
1
1
|
class IProcess
|
2
|
-
|
3
2
|
require_relative 'iprocess/version'
|
4
3
|
require_relative 'iprocess/channel'
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
5
|
+
class << self
|
6
|
+
#
|
7
|
+
# @overload spawn(number_of = 1, worker)
|
8
|
+
#
|
9
|
+
# Spawn one or more subprocesses.
|
10
|
+
#
|
11
|
+
# @param [Integer] number_of
|
12
|
+
# The number of subprocesses to spawn.
|
13
|
+
#
|
14
|
+
# @param [#call] worker
|
15
|
+
# The unit of work to execute in a subprocess.
|
16
|
+
#
|
17
|
+
# @return [Array<Object>]
|
18
|
+
# The return value of the unit if worker.
|
19
|
+
#
|
20
|
+
def spawn(*args, &worker)
|
21
|
+
fork(*args, &worker).map(&:result)
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
#
|
25
|
+
# @overload
|
26
|
+
#
|
27
|
+
# Spawn one or more subprocesses asynchronously.
|
28
|
+
#
|
29
|
+
# @param
|
30
|
+
# (see IProcess.spawn)
|
31
|
+
#
|
32
|
+
# @return [Array<IProcess>]
|
33
|
+
# An array of IProcess objects. See {#defer}.
|
34
|
+
#
|
35
|
+
def spawn!(*args, &worker)
|
36
|
+
fork *args, &worker
|
28
37
|
end
|
38
|
+
|
39
|
+
def fork(number_of = 1, obj = nil, &worker)
|
40
|
+
worker = obj || worker
|
29
41
|
|
30
|
-
|
31
|
-
|
42
|
+
Array.new(number_of) do
|
43
|
+
IProcess.new(worker).tap { |job| job.execute }
|
44
|
+
end
|
32
45
|
end
|
46
|
+
private :fork
|
33
47
|
end
|
34
48
|
|
35
49
|
#
|
@@ -53,6 +67,19 @@ class IProcess
|
|
53
67
|
end
|
54
68
|
end
|
55
69
|
|
70
|
+
#
|
71
|
+
# @param [#recv] listener
|
72
|
+
# The listener.
|
73
|
+
#
|
74
|
+
# @return [void]
|
75
|
+
#
|
76
|
+
def defer(listener)
|
77
|
+
Thread.new do
|
78
|
+
Process.wait @pid
|
79
|
+
listener.recv @channel.recv
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
56
83
|
#
|
57
84
|
# Executes a unit of work in a subprocess.
|
58
85
|
#
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iprocess
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: yard
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0.7'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.7'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: redcarpet
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '1.17'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.17'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: minitest
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '2.6'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.6'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rake
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,7 +69,12 @@ dependencies:
|
|
54
69
|
version: 0.9.2
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.9.2
|
58
78
|
description: A set of classes you can use to transport ruby objects between processes
|
59
79
|
on UNIX-like operating systems.
|
60
80
|
email: rob@flowof.info
|
@@ -96,12 +116,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
116
|
version: 1.3.6
|
97
117
|
requirements: []
|
98
118
|
rubyforge_project: ! '[none]'
|
99
|
-
rubygems_version: 1.8.
|
119
|
+
rubygems_version: 1.8.23
|
100
120
|
signing_key:
|
101
121
|
specification_version: 3
|
102
122
|
summary: A set of classes you can use to transport ruby objects between processes
|
103
123
|
on UNIX-like operating systems.
|
104
124
|
test_files:
|
105
|
-
- test/test_IProcess_class.rb
|
106
125
|
- test/setup.rb
|
126
|
+
- test/test_IProcess_class.rb
|
107
127
|
has_rdoc:
|