Commit cbfd05138190544c646e5ac28cae90a6e5e8ab1a

Authored by zhouhaihai
1 parent 3a646dea

增加池子

@@ -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()
robot/robot_pool.lua 0 → 100644
@@ -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__)
@@ -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