skynet:session

本文探讨了在Skynet框架下,多个协程如何通过session机制确保消息与响应的正确匹配。通过测试脚本演示了如何使用skynet.call和skynet.retpack实现跨服务的消息传递与响应,同时解决了注册函数未定义的问题。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值