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