rbgo 0.1.10 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +27 -7
- data/lib/rbgo/actor.rb +47 -0
- data/lib/rbgo/network_service.rb +7 -16
- data/lib/rbgo/version.rb +1 -1
- data/lib/rbgo.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bccb96948128dee0adbfb357a273c55af918c35148099b90280e09c4af29a88
|
4
|
+
data.tar.gz: 753b306467acaf5b46882b57a42a38d05c64a65496d6d285dca08e99330dc197
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '090379aa03738950d87b5b399a83f5e11b3aef62e6189e94b9df633f6ad7db41f5b5b53dd871b73831b6c1e09d210d71221d9702ecd1d844687d9d6d37128902'
|
7
|
+
data.tar.gz: b1689789770582e853220b084157b3477e7f095e1e0ea4725ef9b7f8b46572e0e71dc4c55c8d78b76cc5adeb12e5dbacd972813728ae8b0dcc66fa9a18e9629b
|
data/README.md
CHANGED
@@ -103,8 +103,31 @@ go! do
|
|
103
103
|
|
104
104
|
end
|
105
105
|
|
106
|
+
# Once do block only once
|
107
|
+
|
108
|
+
once = Rbgo::Once.new
|
109
|
+
2.times do
|
110
|
+
go do
|
111
|
+
once.do { puts 'only once' }
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
106
115
|
|
107
116
|
|
117
|
+
# Actor handle message sequentially
|
118
|
+
|
119
|
+
actor = Rbgo::Actor.new do|msg, actor|
|
120
|
+
case msg
|
121
|
+
when :msg1
|
122
|
+
# do some work
|
123
|
+
when :msg2
|
124
|
+
# do some work
|
125
|
+
when :msg3
|
126
|
+
actor.send_msg :msg1
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
actor.send_msg :msg1 #won't block
|
108
131
|
|
109
132
|
```
|
110
133
|
# NetworkService
|
@@ -119,15 +142,14 @@ require 'rbgo'
|
|
119
142
|
|
120
143
|
#localhost, port 3000
|
121
144
|
tcp_service = Rbgo::NetworkServiceFactory.open_tcp_service(3000) do|sock, clientAddrInfo|
|
122
|
-
p [sock, clientAddrInfo]
|
145
|
+
p [sock, clientAddrInfo]
|
146
|
+
sock.close #SHOULD CLOSE SOCK MANUALLY since version 0.2.0
|
123
147
|
end
|
124
148
|
|
125
149
|
|
126
150
|
|
127
|
-
p "start tcp service: #{[tcp_service.host, tcp_service.port, tcp_service.type]}"
|
128
|
-
|
151
|
+
p "start tcp service: #{[tcp_service.host, tcp_service.port, tcp_service.type]}"
|
129
152
|
sleep 5
|
130
|
-
|
131
153
|
tcp_service.stop
|
132
154
|
|
133
155
|
|
@@ -138,10 +160,8 @@ udp_service = Rbgo::NetworkServiceFactory.open_udp_service(0) do|msg, reply_msg|
|
|
138
160
|
reply_msg.reply("I receive your message")
|
139
161
|
end
|
140
162
|
|
141
|
-
p "start udp service: #{[udp_service.host, udp_service.port, udp_service.type]}"
|
142
|
-
|
163
|
+
p "start udp service: #{[udp_service.host, udp_service.port, udp_service.type]}"
|
143
164
|
sleep 5
|
144
|
-
|
145
165
|
udp_service.stop
|
146
166
|
|
147
167
|
|
data/lib/rbgo/actor.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'thread'
|
2
|
+
require_relative 'corun'
|
3
|
+
|
4
|
+
using Rbgo::CoRunExtensions
|
5
|
+
|
6
|
+
module Rbgo
|
7
|
+
class Actor
|
8
|
+
private
|
9
|
+
|
10
|
+
attr_accessor :mail_box
|
11
|
+
|
12
|
+
public
|
13
|
+
|
14
|
+
attr_accessor :handler
|
15
|
+
|
16
|
+
def initialize(&handler)
|
17
|
+
self.handler = handler
|
18
|
+
self.mail_box = Queue.new
|
19
|
+
start_msg_loop
|
20
|
+
end
|
21
|
+
|
22
|
+
def send_msg(msg)
|
23
|
+
mail_box << msg
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def close
|
28
|
+
mail_box.close
|
29
|
+
mail_box.clear
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def closed?
|
34
|
+
mail_box.closed?
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def start_msg_loop
|
40
|
+
go! do
|
41
|
+
while msg = mail_box.deq
|
42
|
+
handler.call(msg, self) rescue nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/rbgo/network_service.rb
CHANGED
@@ -12,7 +12,8 @@ module Rbgo
|
|
12
12
|
attr_accessor :task
|
13
13
|
|
14
14
|
def alive?
|
15
|
-
service_routine.alive?
|
15
|
+
return service_routine.alive? unless service_routine.nil?
|
16
|
+
false
|
16
17
|
end
|
17
18
|
|
18
19
|
def stop
|
@@ -43,7 +44,7 @@ module Rbgo
|
|
43
44
|
res_chan = Chan.new(1)
|
44
45
|
service = Service.send :new
|
45
46
|
|
46
|
-
routine = go do
|
47
|
+
routine = go! do
|
47
48
|
service.send :type=, :tcp
|
48
49
|
service.send :host=, host
|
49
50
|
service.send :port=, port
|
@@ -52,32 +53,27 @@ module Rbgo
|
|
52
53
|
Socket.tcp_server_sockets(host, port) do |sockets|
|
53
54
|
service.send :port=, sockets.first.local_address.ip_port
|
54
55
|
service.send :sockets=, sockets
|
55
|
-
|
56
56
|
res_chan << service
|
57
|
-
|
58
57
|
begin
|
59
58
|
Socket.accept_loop(sockets) do |sock, clientAddrInfo|
|
60
59
|
go do
|
61
|
-
|
62
|
-
service.task.call(sock, clientAddrInfo) unless service.task.nil?
|
63
|
-
ensure
|
60
|
+
if service.task.nil?
|
64
61
|
sock.close
|
62
|
+
else
|
63
|
+
service.task.call(sock, clientAddrInfo)
|
65
64
|
end
|
66
65
|
end
|
67
66
|
end
|
68
67
|
rescue Exception => ex
|
69
68
|
STDERR.puts ex
|
70
69
|
end
|
71
|
-
|
72
70
|
end
|
73
71
|
rescue Exception => ex
|
74
72
|
res_chan << service
|
75
73
|
STDERR.puts ex
|
76
74
|
end
|
77
75
|
end
|
78
|
-
|
79
76
|
service.send :service_routine=, routine
|
80
|
-
|
81
77
|
res_chan.deq
|
82
78
|
service
|
83
79
|
end
|
@@ -87,7 +83,7 @@ module Rbgo
|
|
87
83
|
res_chan = Chan.new(1)
|
88
84
|
service = Service.send :new
|
89
85
|
|
90
|
-
routine = go do
|
86
|
+
routine = go! do
|
91
87
|
service.send :type=, :udp
|
92
88
|
service.send :host=, host
|
93
89
|
service.send :port=, port
|
@@ -96,9 +92,7 @@ module Rbgo
|
|
96
92
|
Socket.udp_server_sockets(host, port) do |sockets|
|
97
93
|
service.send :port=, sockets.first.local_address.ip_port
|
98
94
|
service.send :sockets=, sockets
|
99
|
-
|
100
95
|
res_chan << service
|
101
|
-
|
102
96
|
begin
|
103
97
|
Socket.udp_server_loop_on(sockets) do |msg, msg_src|
|
104
98
|
go do
|
@@ -108,16 +102,13 @@ module Rbgo
|
|
108
102
|
rescue Exception => ex
|
109
103
|
STDERR.puts ex
|
110
104
|
end
|
111
|
-
|
112
105
|
end
|
113
106
|
rescue Exception => ex
|
114
107
|
res_chan << service
|
115
108
|
STDERR.puts ex
|
116
109
|
end
|
117
110
|
end
|
118
|
-
|
119
111
|
service.send :service_routine=, routine
|
120
|
-
|
121
112
|
res_chan.deq
|
122
113
|
service
|
123
114
|
end
|
data/lib/rbgo/version.rb
CHANGED
data/lib/rbgo.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbgo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wang Yin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: system
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- LICENSE
|
43
43
|
- README.md
|
44
44
|
- lib/rbgo.rb
|
45
|
+
- lib/rbgo/actor.rb
|
45
46
|
- lib/rbgo/corun.rb
|
46
47
|
- lib/rbgo/network_service.rb
|
47
48
|
- lib/rbgo/once.rb
|