28人参与 • 2025-04-12 • 苹果IOS
函数签名:
skynet.call(addr, typename, ...)
addr
:目标服务的地址(整数或字符串形式的服务名)。typename
:消息协议类型(如 "lua"
、"text"
),决定消息的编码方式。...
:消息内容(具体参数,可以是任意lua值)。示例:
local result = skynet.call("db_service", "lua", "query", "select * from users")
skynet.call
是同步操作,发送请求后阻塞当前协程,直到收到响应。session
),用于匹配请求与响应。skynet.wait
挂起,等待响应。skynet.call
调用对应一个唯一会话id,确保请求与响应一一匹配。skynet.call
默认无限等待响应,若目标服务未响应,协程将永久挂起。skynet.timeout
结合 skynet.response
实现超时逻辑:local response = skynet.response() skynet.timeout(500, function() response(false, "timeout") end) local result = skynet.call("service", "lua", "slow_task")
skynet.call
会将错误信息通过 skynet.ret
返回。skynet.ret(skynet.pack(a, b))
返回多个值。skynet.call
自动解包返回值,直接返回多个结果:local a, b = skynet.call("service", "lua", "get_values")
"lua"
协议:
skynet.pack
和 skynet.unpack
序列化数据。"text"
协议:skynet.register_protocol
注册编码/解码函数。特性 | skynet.call | skynet.send |
---|---|---|
同步/异步 | 同步(阻塞等待响应) | 异步(立即返回) |
返回值 | 返回目标服务的响应 | 无返回值 |
会话id | 自动生成并管理 | 无需会话id |
典型场景 | 需要即时结果的请求(如数据库查询) | 通知型消息(如日志记录、事件触发) |
服务端处理请求:
-- 目标服务(db_service) skynet.start(function() skynet.dispatch("lua", function(session, source, cmd, ...) if cmd == "query" then local sql = ... local data = execute_query(sql) skynet.ret(skynet.pack(data)) -- 返回查询结果 end end) end)
客户端调用:
-- 调用方服务 local result = skynet.call("db_service", "lua", "query", "select * from users") print("query result:", result)
"lua"
协议,支持复杂数据结构。skynet.ret
返回错误信息。skynet.fork
创建子协程,避免阻塞主消息循环。skynet.call
是 skynet 中实现服务间同步调用的核心 api,通过会话id和协程调度机制实现高效的请求-响应模型。理解其内部机制和协议类型的选择,能够帮助开发者构建稳定、高效的服务间通信逻辑。
到此这篇关于skynet.call使用详解的文章就介绍到这了,更多相关skynet.call使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论