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 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