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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce5380534583083998d908ac2ecb726a941bdc1e697cc8b1a6e6e10477e1bec6
4
- data.tar.gz: 5eb7fd7557bef0a324a3a9b099e0c53bb2f71110107421d9b017bb42c99c9738
3
+ metadata.gz: 5bccb96948128dee0adbfb357a273c55af918c35148099b90280e09c4af29a88
4
+ data.tar.gz: 753b306467acaf5b46882b57a42a38d05c64a65496d6d285dca08e99330dc197
5
5
  SHA512:
6
- metadata.gz: 194e1bbd2eee668bf3221db0c2b7dc888dbdf54b1ef2274c06ec51b031250e8858a134d37cf9b9c81c31c8d054723f6ffa3483409c5e642778e6391b7fdd823e
7
- data.tar.gz: 7ba0c5eace41ad7d673d536dd6c80e0af03fcc53cdca945a2d2041f699bbcf13dc4ea075770e1302184566b8af80e51dab2fbf3a44f577918aef01db7f6f27a6
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
@@ -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
- begin
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
@@ -1,3 +1,3 @@
1
1
  module Rbgo
2
- VERSION = "0.1.10"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/rbgo.rb CHANGED
@@ -2,5 +2,6 @@ require_relative 'rbgo/corun'
2
2
  require_relative 'rbgo/select_chan'
3
3
  require_relative 'rbgo/wait_group'
4
4
  require_relative 'rbgo/once'
5
+ require_relative 'rbgo/actor'
5
6
  require_relative 'rbgo/network_service'
6
7
  require_relative 'rbgo/version'
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.1.10
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-06 00:00:00.000000000 Z
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