当一个服务使用多个协程发送消息时,可能出现多个协程都在等待响应。那么当某个响应到达时,应该唤醒哪个协程,可通过 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”