skynet:session

當一個服務使用多個協程發送消息時,可能出現多個協程都在等待響應。那麼當某個響應到達時,應該喚醒哪個協程,可通過 session 來判斷,這是因爲在 skynet 中,session 能保證消息在本服務中的唯一性,從而使消息與響應一一對應起來。

但 session 只有在使用 skynet.call 或 skynet.rawcall 發送消息時纔有意義。

一、測試腳本

echoluamsg.lua

skynet = require "skynet"
require "skynet.manager"

skynet.start(function()
        skynet.register("echoluamsg")

        skynet.dispatch("lua", function(session, address, msg)
                skynet.sleep(math.random(100, 500))
                skynet.retpack(msg:upper())
        end)
end)

testforkcall.lua

skynet = require "skynet"


local function task(id)
        for i = 1,5 do
                skynet.error("task"..id .." return:", skynet.call("echoluamsg", "lua", "task"..id))
        end
end

skynet.start(function()
        skynet.fork(task, 1)
        skynet.fork(task, 2)
end)

main.lua

local skynet =  require "skynet"

local socket_id = nil

skynet.start(function()
        skynet.newservice("myservice/echoluamsg")
        skynet.newservice("myservice/testforkcall")
        skynet.exit()
end)

協程使用 skynet.call() 向其他服務發送消息後,其他服務可通過 skynet.retpack() 對消息進行應答,通過 session,響應信息可返回給正確的消息源。

二、測試結果

在這裏插入圖片描述

問題一、attempt to call a nil value (field ‘register’)

解決方法:

require “skynet.manager”

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