Commit cbfd05138190544c646e5ac28cae90a6e5e8ab1a
1 parent
3a646dea
增加池子
Showing
4 changed files
with
73 additions
and
13 deletions
Show diff stats
robot/robot.lua
@@ -16,6 +16,7 @@ local eventListener = {} | @@ -16,6 +16,7 @@ local eventListener = {} | ||
16 | 16 | ||
17 | local ignoreListener = { | 17 | local ignoreListener = { |
18 | ["Role.updateProperty"] = function(data) | 18 | ["Role.updateProperty"] = function(data) |
19 | + if not client.role then return end | ||
19 | local msg = MsgPack.unpack(data) | 20 | local msg = MsgPack.unpack(data) |
20 | for _, one in pairs(msg) do | 21 | for _, one in pairs(msg) do |
21 | client.role[one.key] = one.newValue | 22 | client.role[one.key] = one.newValue |
@@ -80,7 +81,7 @@ function triggerListener(listener, data) | @@ -80,7 +81,7 @@ function triggerListener(listener, data) | ||
80 | ignoreListener[listener](data) | 81 | ignoreListener[listener](data) |
81 | end | 82 | end |
82 | else | 83 | else |
83 | - log(listener .. " no handle!!!") | 84 | + -- log(listener .. " no handle!!!") |
84 | end | 85 | end |
85 | end | 86 | end |
86 | 87 |
robot/robot_main.lua
@@ -9,8 +9,12 @@ skynet.start(function() | @@ -9,8 +9,12 @@ skynet.start(function() | ||
9 | local inpre = math.ceil(config.inpre / need) | 9 | local inpre = math.ceil(config.inpre / need) |
10 | local idRange = math.ceil(config.max / need) | 10 | local idRange = math.ceil(config.max / need) |
11 | local curId = 1 | 11 | local curId = 1 |
12 | + local poold = skynet.newservice("robot_pool") | ||
13 | + local pooldObj = skynet.call(poold, "lua", "start", config.online + preOnlineCount) | ||
14 | + | ||
12 | for i = 1, need do | 15 | for i = 1, need do |
13 | - skynet.newservice("start", preOnlineCount, curId, curId + idRange - 1, inpre) | 16 | + local start = skynet.newservice("start") |
17 | + skynet.send(start, "lua", "start", poold, pooldObj, preOnlineCount, curId, curId + idRange - 1, inpre) | ||
14 | curId = curId + idRange | 18 | curId = curId + idRange |
15 | end | 19 | end |
16 | skynet.exit() | 20 | skynet.exit() |
@@ -0,0 +1,46 @@ | @@ -0,0 +1,46 @@ | ||
1 | +--[[ | ||
2 | + deque 为了减少锁竞争,尽量保证 a服务 push;b服务 pop | ||
3 | +]] | ||
4 | +local skynet = require "skynet" | ||
5 | +local deque = require "deque" | ||
6 | + | ||
7 | +local CMD = {} | ||
8 | +local factory | ||
9 | + | ||
10 | +local PRE_FEED_COUNT = 5 | ||
11 | +local dead = 0 | ||
12 | +-- agent死亡,通知poold补充,当累计到5个agent时,马上生成5个agent放入poold中 | ||
13 | +-- 当然这里也可以写得更复杂,参考redis落地规则 | ||
14 | +function CMD.feed() | ||
15 | + dead = dead + 1 | ||
16 | + if dead == PRE_FEED_COUNT then | ||
17 | + dead = 0 | ||
18 | + for i=1, PRE_FEED_COUNT do | ||
19 | + factory:push(skynet.newservice("robot")) | ||
20 | + end | ||
21 | + end | ||
22 | +end | ||
23 | + | ||
24 | +-- 系统启动,生成count个agent放入双端队列中 | ||
25 | +function CMD.start(count) | ||
26 | + factory, addr = deque.new(count) | ||
27 | + | ||
28 | + for i = 1, count do | ||
29 | + factory:push(skynet.newservice("robot")) | ||
30 | + end | ||
31 | + | ||
32 | + return addr | ||
33 | +end | ||
34 | + | ||
35 | +local function __init__() | ||
36 | + skynet.dispatch("lua", function (_, _, command, ...) | ||
37 | + local f = CMD[command] | ||
38 | + if command == "start" then | ||
39 | + skynet.ret(skynet.pack(f(...))) | ||
40 | + return | ||
41 | + end | ||
42 | + f(...) | ||
43 | + end) | ||
44 | +end | ||
45 | + | ||
46 | +skynet.start(__init__) |
robot/start.lua
@@ -5,19 +5,17 @@ local config = require "robot_config" | @@ -5,19 +5,17 @@ local config = require "robot_config" | ||
5 | local skynet = require "skynet" | 5 | local skynet = require "skynet" |
6 | local netpack = require "skynet.netpack" | 6 | local netpack = require "skynet.netpack" |
7 | local socketdriver = require "skynet.socketdriver" | 7 | local socketdriver = require "skynet.socketdriver" |
8 | +local deque = require "deque" | ||
8 | local string_format = string.format | 9 | local string_format = string.format |
9 | 10 | ||
10 | -local onlineCount, startId, endId, inpre = ... | ||
11 | -onlineCount = tonumber(onlineCount) | ||
12 | -startId = tonumber(startId) | ||
13 | -endId = tonumber(endId) | ||
14 | -inpre = tonumber(inpre) | 11 | +local poold, pooldObj, onlineCount, startId, endId, inpre |
12 | +local factory | ||
15 | 13 | ||
16 | local queue = {} | 14 | local queue = {} |
17 | local fd2serv = {} | 15 | local fd2serv = {} |
18 | local id2fd = {} | 16 | local id2fd = {} |
19 | local MSG = {} | 17 | local MSG = {} |
20 | -local id_max = startId - 1 -- robot id | 18 | +local id_max |
21 | 19 | ||
22 | 20 | ||
23 | function MSG.open( ... ) | 21 | function MSG.open( ... ) |
@@ -27,9 +25,11 @@ end | @@ -27,9 +25,11 @@ end | ||
27 | function MSG.close(fd) | 25 | function MSG.close(fd) |
28 | if fd2serv[fd] and not fd2serv[fd].closing then | 26 | if fd2serv[fd] and not fd2serv[fd].closing then |
29 | fd2serv[fd].closing = true | 27 | fd2serv[fd].closing = true |
28 | + print(fd2serv[fd].agent) | ||
30 | skynet.call(fd2serv[fd].agent, "lua", "exit") | 29 | skynet.call(fd2serv[fd].agent, "lua", "exit") |
31 | - log(string_format("logout %s", fd2serv[fd].id)) | 30 | + pcall(skynet.send, poold, "lua", "feed") |
32 | 31 | ||
32 | + log(string_format("logout %s", fd2serv[fd].id)) | ||
33 | id2fd[fd2serv[fd].id] = nil | 33 | id2fd[fd2serv[fd].id] = nil |
34 | fd2serv[fd] = nil | 34 | fd2serv[fd] = nil |
35 | end | 35 | end |
@@ -78,7 +78,8 @@ skynet.register_protocol { | @@ -78,7 +78,8 @@ skynet.register_protocol { | ||
78 | } | 78 | } |
79 | 79 | ||
80 | local function add_robot() | 80 | local function add_robot() |
81 | - local robot = skynet.newservice("robot") | 81 | + local time = skynet.time() |
82 | + local robot = factory:pop() | ||
82 | local fd = socketdriver.connect(config.host, config.port) | 83 | local fd = socketdriver.connect(config.host, config.port) |
83 | socketdriver.start(fd) | 84 | socketdriver.start(fd) |
84 | local id | 85 | local id |
@@ -97,7 +98,6 @@ local function add_robot() | @@ -97,7 +98,6 @@ local function add_robot() | ||
97 | id2fd[id] = fd | 98 | id2fd[id] = fd |
98 | pcall(skynet.call, robot, "lua", "start", fd, id, prefix) | 99 | pcall(skynet.call, robot, "lua", "start", fd, id, prefix) |
99 | log(string_format("login %s", fd2serv[fd].id)) | 100 | log(string_format("login %s", fd2serv[fd].id)) |
100 | - | ||
101 | -- 定时下线 | 101 | -- 定时下线 |
102 | skynet.timeout(math.randomInt(config.online_time[1], config.online_time[2]) * 100, function() | 102 | skynet.timeout(math.randomInt(config.online_time[1], config.online_time[2]) * 100, function() |
103 | MSG.close(fd) | 103 | MSG.close(fd) |
@@ -122,9 +122,13 @@ local function online() | @@ -122,9 +122,13 @@ local function online() | ||
122 | skynet.timeout(100, online) | 122 | skynet.timeout(100, online) |
123 | end | 123 | end |
124 | 124 | ||
125 | -local function start() | 125 | +local function start(pooldp, pooldObj, onlineCountp, startIdp, endIdp, inprep) |
126 | log("start testing ...") | 126 | log("start testing ...") |
127 | 127 | ||
128 | + factory = deque.clone(pooldObj) | ||
129 | + poold, onlineCount, startId, endId, inpre = pooldp, onlineCountp, startIdp, endIdp, inprep | ||
130 | + id_max = startId - 1 | ||
131 | + | ||
128 | for i = 1, onlineCount, inpre do | 132 | for i = 1, onlineCount, inpre do |
129 | for j = 1, inpre do | 133 | for j = 1, inpre do |
130 | add_robot() | 134 | add_robot() |
@@ -137,5 +141,10 @@ local function start() | @@ -137,5 +141,10 @@ local function start() | ||
137 | end | 141 | end |
138 | 142 | ||
139 | skynet.start(function() | 143 | skynet.start(function() |
140 | - skynet.fork(start) | 144 | + skynet.dispatch("lua", function (_, _, command, ...) |
145 | + if command == "start" then | ||
146 | + start(...) | ||
147 | + return | ||
148 | + end | ||
149 | + end) | ||
141 | end) | 150 | end) |
142 | \ No newline at end of file | 151 | \ No newline at end of file |