在 skynet 中,當服務收到消息後,skynet 會起一個協程來處理消息,當某個協程涉及到異步讓出執行時,skynet 會繼續執行下一條消息,等到該協程的醒消息到達時便繼續執行。
有時候,我們想保持處理客戶端發送消息的順序性,比如客戶端依次發送消息 a 和 b ,而由於某種需求,我們又要保證 b 一定要在 a 之後返回,這個時候就需要用到 skynet.queue。
使用方法:
local queue = require "skynet.queue"
local cs = queue() --獲取一個執行隊列,返回值爲一個 closure
cs(f, ...) --將 函數f 及 參數 丟到隊列中
一、測試腳本
修改前一篇文章:skynet:服務重入問題 中的測試腳本:echoluamsg.lua:
skynet = require "skynet"
require "skynet.manager"
local queue = require "skynet.queue"
local cs = queue()
local command = {}
function command.func1()
skynet.sleep(2000)
return 1
end
function command.func2()
return 2
end
skynet.start(function()
skynet.register("echoluamsg")
skynet.dispatch("lua", function(session, address, cmd)
local f = command[cmd]
if f then
cs(function()
print(cmd .. " start")
ret = cs(f)
skynet.retpack(ret)
print(cmd .. " end, ret:" .. ret)
end)
end
end)
end)