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 |