rbgo 0.1.10 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|