當一個服務使用多個協程發送消息時,可能出現多個協程都在等待響應。那麼當某個響應到達時,應該喚醒哪個協程,可通過 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”