服务类型
- 普通服务
- 全局唯一服务(只能生成一个服务实例)
普通服务
创建接口skynet.newservice(luaServerName)
- 用于启动一个新的 Lua 服务,luaServerName是脚本的名字(不用写 .lua 后缀)。
- 只有被启动的脚本的 start 函数返回后,这个 API 才会返回启动的服务的地址,这是一个阻塞 API 。
- 如果被启动的脚本在初始化环节抛出异常,skynet.newservice 也会执行失败。
- 如果被启动的脚本的 start 函数是一个永不结束的循环,那么 newservice 也会被永远阻塞住。
启动一个test服务4-test.lua
:
local skynet = require "skynet"
skynet.start(function()
skynet.error("my new service")
skynet.newservice("1-test") -- 启动另一个服务的文件
skynet.error("new test service")
end)
启动两个test服务
5-test.lua
:
local skynet = require "skynet"
skynet.start(function()
skynet.error("my new service")
skynet.newservice("1-test")
skynet.error("test servicer 1")
skynet.newservice("1-test")
skynet.error("test servicer 2")
end)
全局唯一服务
- 创建接口:
skynet.uniqueservice(servicename, ...)
skynet.uniqueservice(true, servicename, ...)
当带参数true
时,则表示此服务在所有节点之间是唯一的。第一次创建返回服务地址,第二次创建不会创建服务,而是返回第一次创建的服务地址
- 查询接口
skynet.queryservice(servicename, ...)
skynet.queryservice(true, servicename, ...)
如果还没有创建过目标服务则一直等下去,直到目标服务被其他服务触发创建
当带参数true
则表示查询在所有节点中唯一的服务是否存在
测试uniqueservice接口6-test.lua
local skynet = require "skynet"
local args = {}
table.insert(args, 1, "1-test")
table.insert(args, 1, "1-test")
skynet.start(function()
skynet.error(args[1], args[2], #args)
local us1 = 0
local us2 = 0
skynet.error("test unique service")
skynet.error("1, 所有")
us1 = skynet.uniqueservice(true, args[1])
skynet.error("2, 当前")
us2 = skynet.uniqueservice(args[2])
skynet.error("全部节点 全局唯一句柄",us1)
skynet.error("当前节点 全局唯一句柄",us2)
end)
第二次执行,没有创建新的服务
测试queryservice接口7-test.lua
:
local skynet = require "skynet"
local args = {}
table.insert(args, 1, "1-test")
table.insert(args, 1, "1-test")
skynet.start(function()
skynet.error(args[1], args[2], #args)
local us1 = 0
local us2 = 0
skynet.error("test unique service")
skynet.error("1, 所有")
us1 = skynet.queryservice(true, args[1])
skynet.error("2, 当前")
us2 = skynet.queryservice(args[2])
skynet.error("全部节点 全局唯一句柄",us1)
skynet.error("当前节点 全局唯一句柄",us2)
end)
不启动test直接启动会阻塞
启动test后执行
-----------------------暂停笔记
视频 8 博文 4