skynet:queue

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

二、測試結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章