ntl-actor 0.6.2 → 1.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/actor.rb +45 -19
- data/lib/actor/actor.rb +12 -132
- data/lib/actor/build.rb +36 -0
- data/lib/actor/controls.rb +7 -7
- data/lib/actor/messages.rb +20 -4
- data/lib/actor/messaging/address.rb +26 -0
- data/lib/actor/messaging/address/controls.rb +11 -0
- data/lib/actor/messaging/address/dependency.rb +13 -0
- data/lib/actor/messaging/address/none.rb +33 -0
- data/lib/actor/messaging/message.rb +39 -1
- data/lib/actor/messaging/message/name.rb +33 -0
- data/lib/actor/messaging/publisher.rb +39 -0
- data/lib/actor/messaging/publisher/assertions.rb +11 -0
- data/lib/actor/messaging/publisher/dependency.rb +13 -0
- data/lib/actor/messaging/publisher/substitute.rb +62 -0
- data/lib/actor/messaging/queue.rb +21 -0
- data/lib/actor/messaging/queue/substitute.rb +53 -0
- data/lib/actor/messaging/reader.rb +32 -0
- data/lib/actor/messaging/reader/assertions.rb +25 -0
- data/lib/actor/messaging/reader/dependency.rb +13 -0
- data/lib/actor/messaging/reader/substitute.rb +31 -0
- data/lib/actor/messaging/writer.rb +28 -0
- data/lib/actor/messaging/writer/dependency.rb +13 -0
- data/lib/actor/messaging/writer/substitute.rb +45 -0
- data/lib/actor/module/dependencies.rb +30 -0
- data/lib/actor/module/dependencies/assertions.rb +23 -0
- data/lib/actor/module/handler.rb +31 -0
- data/lib/actor/module/handler/macro.rb +13 -0
- data/lib/actor/module/handler/method_name.rb +13 -0
- data/lib/actor/module/include_assertions.rb +18 -0
- data/lib/actor/module/run_loop.rb +19 -0
- data/lib/actor/module/start.rb +27 -0
- data/lib/actor/module/suspend_resume.rb +36 -0
- data/lib/actor/module/suspend_resume/assertions.rb +26 -0
- data/lib/actor/module/suspend_resume/configure.rb +13 -0
- data/lib/actor/module/suspend_resume/controls.rb +17 -0
- data/lib/actor/module/suspend_resume/handle.rb +17 -0
- data/lib/actor/module/suspend_resume/initialize.rb +13 -0
- data/lib/actor/start.rb +34 -34
- data/lib/actor/supervisor.rb +60 -71
- data/lib/actor/supervisor/address/get.rb +15 -0
- data/lib/actor/supervisor/address/put.rb +13 -0
- data/lib/actor/supervisor/address/registry.rb +7 -0
- data/lib/actor/supervisor/assertions.rb +20 -0
- metadata +42 -28
- data/lib/actor/address.rb +0 -18
- data/lib/actor/controls/actor.rb +0 -89
- data/lib/actor/controls/address.rb +0 -48
- data/lib/actor/controls/error.rb +0 -11
- data/lib/actor/controls/message.rb +0 -39
- data/lib/actor/controls/message/attribute.rb +0 -17
- data/lib/actor/controls/thread.rb +0 -9
- data/lib/actor/controls/uuid.rb +0 -15
- data/lib/actor/destructure.rb +0 -23
- data/lib/actor/duration.rb +0 -7
- data/lib/actor/future.rb +0 -38
- data/lib/actor/handle_macro.rb +0 -37
- data/lib/actor/messaging/read.rb +0 -54
- data/lib/actor/messaging/read/substitute.rb +0 -33
- data/lib/actor/messaging/write.rb +0 -26
- data/lib/actor/messaging/write/substitute.rb +0 -39
- data/lib/actor/observers.rb +0 -45
- data/lib/actor/router.rb +0 -94
- data/lib/actor/stream.rb +0 -36
- data/lib/actor/substitutes/kernel.rb +0 -23
- data/lib/actor/substitutes/thread.rb +0 -39
- data/lib/actor/substitutes/thread_group.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9362612be3698e03771c7fb5098807275df662eb
|
4
|
+
data.tar.gz: e3052225551eb88b84ac6ed57d3699c588c0c37d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edb4844e21afd14350a9d872cf7fc4eb219b53c7250647fd121c2e7d4fde80307d273fd5e8c585641ea7ff3338b43de6c9b786bf652ed00a4022aa22ec738ae3
|
7
|
+
data.tar.gz: 128a2647b95a7f97b83c91c88d22dca296a6544a2a4b0976aa0dcf669b4ba17236df3da55a5647693fa9aa95a67be9b0c18d44ce992635534386630fc34dc8f6
|
data/lib/actor.rb
CHANGED
@@ -1,31 +1,57 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
require 'set'
|
3
|
-
require 'timeout'
|
4
3
|
|
5
|
-
require 'actor/
|
6
|
-
require 'actor/
|
7
|
-
require 'actor/
|
4
|
+
require 'actor/messaging/queue'
|
5
|
+
require 'actor/messaging/queue/substitute'
|
6
|
+
require 'actor/messaging/queue/substitute'
|
8
7
|
|
9
|
-
require 'actor/
|
10
|
-
require 'actor/
|
11
|
-
require 'actor/
|
8
|
+
require 'actor/messaging/address'
|
9
|
+
require 'actor/messaging/address/controls'
|
10
|
+
require 'actor/messaging/address/dependency'
|
11
|
+
require 'actor/messaging/address/none'
|
12
12
|
|
13
|
-
require 'actor/address'
|
14
13
|
require 'actor/messaging/message'
|
15
|
-
require 'actor/messaging/
|
16
|
-
require 'actor/messaging/read/substitute'
|
17
|
-
require 'actor/messaging/write'
|
18
|
-
require 'actor/messaging/write/substitute'
|
14
|
+
require 'actor/messaging/message/name'
|
19
15
|
|
20
|
-
require 'actor/
|
16
|
+
require 'actor/messaging/reader'
|
17
|
+
require 'actor/messaging/reader/assertions'
|
18
|
+
require 'actor/messaging/reader/dependency'
|
19
|
+
require 'actor/messaging/reader/substitute'
|
21
20
|
|
22
|
-
require 'actor/
|
23
|
-
require 'actor/
|
21
|
+
require 'actor/messaging/writer'
|
22
|
+
require 'actor/messaging/writer/dependency'
|
23
|
+
require 'actor/messaging/writer/substitute'
|
24
24
|
|
25
|
-
require 'actor/
|
25
|
+
require 'actor/messaging/publisher'
|
26
|
+
require 'actor/messaging/publisher/assertions'
|
27
|
+
require 'actor/messaging/publisher/dependency'
|
28
|
+
require 'actor/messaging/publisher/substitute'
|
26
29
|
|
27
|
-
require 'actor/
|
30
|
+
require 'actor/messages'
|
31
|
+
|
32
|
+
require 'actor/module/dependencies'
|
33
|
+
require 'actor/module/dependencies/assertions'
|
34
|
+
require 'actor/module/handler'
|
35
|
+
require 'actor/module/handler/method_name'
|
36
|
+
require 'actor/module/handler/macro'
|
37
|
+
require 'actor/module/include_assertions'
|
38
|
+
require 'actor/module/run_loop'
|
39
|
+
require 'actor/module/start'
|
40
|
+
require 'actor/module/suspend_resume'
|
41
|
+
require 'actor/module/suspend_resume/assertions'
|
42
|
+
require 'actor/module/suspend_resume/configure'
|
43
|
+
require 'actor/module/suspend_resume/controls'
|
44
|
+
require 'actor/module/suspend_resume/handle'
|
45
|
+
require 'actor/module/suspend_resume/initialize'
|
46
|
+
|
47
|
+
require 'actor/build'
|
48
|
+
require 'actor/controls'
|
49
|
+
require 'actor/start'
|
28
50
|
|
29
|
-
require 'actor/future'
|
30
|
-
require 'actor/router'
|
31
51
|
require 'actor/supervisor'
|
52
|
+
require 'actor/supervisor/address/get'
|
53
|
+
require 'actor/supervisor/address/put'
|
54
|
+
require 'actor/supervisor/address/registry'
|
55
|
+
require 'actor/supervisor/assertions'
|
56
|
+
|
57
|
+
require 'actor/actor'
|
data/lib/actor/actor.rb
CHANGED
@@ -1,137 +1,17 @@
|
|
1
1
|
module Actor
|
2
|
-
# It is possible to `include Actor' in the top-level namespace in order to
|
3
|
-
# bring this library's constants into focus (i.e. reference them without any
|
4
|
-
# leading `Actor' reference to qualify them). The test suite does this; see
|
5
|
-
# tests/test_init.rb. In that case, we take care not to attach any Actor
|
6
|
-
# behavior onto Object. This is achieved by placing the implementation of
|
7
|
-
# Actor in Actor::Module
|
8
2
|
def self.included cls
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
attr_writer :address
|
25
|
-
attr_writer :reader
|
26
|
-
attr_writer :writer
|
27
|
-
|
28
|
-
def configure
|
29
|
-
end
|
30
|
-
|
31
|
-
def continuations
|
32
|
-
@continuations ||= []
|
33
|
-
end
|
34
|
-
|
35
|
-
def handle message
|
36
|
-
method = handle? message
|
37
|
-
|
38
|
-
return if method.nil?
|
39
|
-
|
40
|
-
if method.arity == 0
|
41
|
-
return_value = method.()
|
42
|
-
else
|
43
|
-
return_value = method.(message)
|
44
|
-
end
|
45
|
-
|
46
|
-
notify_observers message
|
47
|
-
|
48
|
-
return_value
|
49
|
-
end
|
50
|
-
|
51
|
-
def handle_stop
|
52
|
-
raise StopIteration
|
53
|
-
end
|
54
|
-
|
55
|
-
def handle? message
|
56
|
-
method_name = HandleMacro::MethodName.get message
|
57
|
-
|
58
|
-
if respond_to? method_name
|
59
|
-
method method_name
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def next
|
64
|
-
if continuations.empty?
|
65
|
-
message = reader.(wait: true)
|
66
|
-
else
|
67
|
-
message = reader.(wait: false)
|
68
|
-
message ||= continuations.shift
|
69
|
-
end
|
70
|
-
|
71
|
-
continuation_message = handle message
|
72
|
-
|
73
|
-
if handle? continuation_message
|
74
|
-
continuations << continuation_message
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def run_loop
|
79
|
-
loop do
|
80
|
-
self.next
|
81
|
-
Thread.pass
|
82
|
-
end
|
83
|
-
end
|
84
|
-
alias_method :start, :run_loop
|
85
|
-
|
86
|
-
def address
|
87
|
-
@address ||= Address::None
|
88
|
-
end
|
89
|
-
|
90
|
-
def reader
|
91
|
-
@reader ||= Messaging::Read::Substitute.new
|
92
|
-
end
|
93
|
-
|
94
|
-
def writer
|
95
|
-
@writer ||= Messaging::Write::Substitute.new
|
96
|
-
end
|
97
|
-
|
98
|
-
module Configure
|
99
|
-
def configure
|
100
|
-
super
|
101
|
-
|
102
|
-
self.reader = Messaging::Read.build address
|
103
|
-
self.writer = Messaging::Write.new
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
module Start
|
108
|
-
def start *positional_arguments, address: nil, supervisor_address: nil, include: nil, **keyword_arguments, &block
|
109
|
-
address ||= Address.build
|
110
|
-
|
111
|
-
if respond_to? :build
|
112
|
-
constructor = method :build
|
113
|
-
else
|
114
|
-
constructor = method :new
|
115
|
-
end
|
116
|
-
|
117
|
-
if keyword_arguments.empty?
|
118
|
-
instance = constructor.(*positional_arguments, &block)
|
119
|
-
else
|
120
|
-
instance = constructor.(*positional_arguments, **keyword_arguments, &block)
|
121
|
-
end
|
122
|
-
|
123
|
-
instance.address = address
|
124
|
-
|
125
|
-
instance.configure
|
126
|
-
|
127
|
-
thread = Actor::Start.(
|
128
|
-
instance,
|
129
|
-
address,
|
130
|
-
supervisor_address: supervisor_address
|
131
|
-
)
|
132
|
-
|
133
|
-
Destructure.(address, include, { :thread => thread, :actor => instance })
|
134
|
-
end
|
3
|
+
# Actor can be included in the main object (TOPLEVEL_BINDING.receiver) in
|
4
|
+
# order to bring the constants contained in within the Actor namespace to
|
5
|
+
# the top level. When we do so, it is necessary to prevent the actual mixin
|
6
|
+
# from altering the main object.
|
7
|
+
return if cls.eql? Object
|
8
|
+
|
9
|
+
cls.class_exec do
|
10
|
+
extend Module::Start
|
11
|
+
include Module::Dependencies
|
12
|
+
include Module::Handler
|
13
|
+
include Module::RunLoop
|
14
|
+
include Module::SuspendResume
|
135
15
|
end
|
136
16
|
end
|
137
17
|
end
|
data/lib/actor/build.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Actor
|
2
|
+
class Build
|
3
|
+
attr_reader :arguments
|
4
|
+
attr_reader :block
|
5
|
+
attr_reader :cls
|
6
|
+
|
7
|
+
def initialize cls, arguments, &block
|
8
|
+
@arguments = arguments
|
9
|
+
@block = block
|
10
|
+
@cls = cls
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.call cls, *arguments, &block
|
14
|
+
instance = new cls, arguments, &block
|
15
|
+
instance.()
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
if cls.respond_to? :build
|
20
|
+
method = cls.method :build
|
21
|
+
else
|
22
|
+
method = cls.method :new
|
23
|
+
end
|
24
|
+
|
25
|
+
if block
|
26
|
+
actor = method.(*arguments, &block)
|
27
|
+
else
|
28
|
+
actor = method.(*arguments)
|
29
|
+
end
|
30
|
+
|
31
|
+
actor.configure
|
32
|
+
|
33
|
+
actor
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/actor/controls.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
module Actor
|
2
|
+
module Controls
|
3
|
+
def next_message= message
|
4
|
+
reader.add message
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
data/lib/actor/messages.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
module Actor
|
2
2
|
module Messages
|
3
|
-
|
3
|
+
module Start
|
4
|
+
extend Messaging::Message
|
5
|
+
end
|
6
|
+
|
7
|
+
ActorStarted = Struct.new :address do
|
4
8
|
include Messaging::Message
|
5
9
|
end
|
6
10
|
|
7
|
-
|
11
|
+
ActorStopped = Struct.new :address do
|
8
12
|
include Messaging::Message
|
9
13
|
end
|
10
14
|
|
@@ -12,8 +16,20 @@ module Actor
|
|
12
16
|
include Messaging::Message
|
13
17
|
end
|
14
18
|
|
15
|
-
|
16
|
-
|
19
|
+
module Suspend
|
20
|
+
extend Messaging::Message
|
21
|
+
end
|
22
|
+
|
23
|
+
module Resume
|
24
|
+
extend Messaging::Message
|
25
|
+
end
|
26
|
+
|
27
|
+
module Shutdown
|
28
|
+
extend Messaging::Message
|
29
|
+
end
|
30
|
+
|
31
|
+
module Stop
|
32
|
+
extend Messaging::Message
|
17
33
|
end
|
18
34
|
end
|
19
35
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
Address = Struct.new :id, :queue
|
4
|
+
|
5
|
+
class Address
|
6
|
+
def self.build max_queue_size: nil
|
7
|
+
id = SecureRandom.uuid
|
8
|
+
queue = Queue.get max_size: max_queue_size
|
9
|
+
|
10
|
+
new id, queue
|
11
|
+
end
|
12
|
+
|
13
|
+
def actors_waiting
|
14
|
+
queue.num_waiting
|
15
|
+
end
|
16
|
+
|
17
|
+
def queue_size
|
18
|
+
queue.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def queue_max_size
|
22
|
+
queue.max
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Actor
|
2
|
+
module Messaging
|
3
|
+
class Address
|
4
|
+
class None < Address
|
5
|
+
def self.build
|
6
|
+
id = ID.get
|
7
|
+
queue = Queue.new
|
8
|
+
|
9
|
+
new id, queue
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.instance
|
13
|
+
@instance ||= build
|
14
|
+
end
|
15
|
+
|
16
|
+
class Queue
|
17
|
+
def deq non_block=nil
|
18
|
+
sleep unless non_block == true
|
19
|
+
end
|
20
|
+
|
21
|
+
def enq msg, non_block=nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module ID
|
26
|
+
def self.get
|
27
|
+
'(none)'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,5 +1,43 @@
|
|
1
1
|
module Actor
|
2
2
|
module Messaging
|
3
|
-
Message
|
3
|
+
module Message
|
4
|
+
def self.included cls
|
5
|
+
cls.class_exec do
|
6
|
+
extend Matcher
|
7
|
+
extend MessageName
|
8
|
+
|
9
|
+
include MessageName
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.extended receiver
|
14
|
+
receiver.instance_exec do
|
15
|
+
extend Matcher
|
16
|
+
extend MessageName
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.=== object
|
21
|
+
if object.is_a? Symbol
|
22
|
+
true
|
23
|
+
else
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module Matcher
|
29
|
+
def === other
|
30
|
+
other_message_name = Name.get other
|
31
|
+
|
32
|
+
message_name == other_message_name
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module MessageName
|
37
|
+
def message_name
|
38
|
+
Name.get name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
4
42
|
end
|
5
43
|
end
|