函数签名:
1 |
skynet.call(addr, typename, ...) |
示例:
1 |
local result = skynet.call("db_service", "lua", "query", "SELECT * FROM users") |
1 2 3 4 5 |
local response = skynet.response() skynet.timeout(500, function() response(false, "Timeout") end) local result = skynet.call("service", "lua", "slow_task") |
1 |
local a, b = skynet.call("service", "lua", "get_values") |
特性 | skynet.call | skynet.send |
---|---|---|
同步/异步 | 同步(阻塞等待响应) | 异步(立即返回) |
返回值 | 返回目标服务的响应 | 无返回值 |
会话ID | 自动生成并管理 | 无需会话ID |
典型场景 | 需要即时结果的请求(如数据库查询) | 通知型消息(如日志记录、事件触发) |
服务端处理请求:
1 2 3 4 5 6 7 8 9 10 |
-- 目标服务(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) |
客户端调用:
1 2 3 |
-- 调用方服务 local result = skynet.call("db_service", "lua", "query", "SELECT * FROM users") print("Query result:", result) |
skynet.call 是 Skynet 中实现服务间同步调用的核心 API,通过会话ID和协程调度机制实现高效的请求-响应模型。理解其内部机制和协议类型的选择,能够帮助开发者构建稳定、高效的服务间通信逻辑。