watch_syn.lua 监听同步机制

watch_syn.lua

sever

  • M.new_server(CMD)
    函数作用域:M 对象的成员函数
    描述: 创建一个发布者对象,需要在代码load中创建好。
    参数:
    - CMD (table): 模块的CMDtable
    返回值:
    1. server_obj(table): 发布者对象

为什么需要传递CMD,因为发布者需要创建watchunwatch两个接口,还有如果是热更服务还需要处理fix_eixt,cancel_exit的回调。

  • server:register(name, init_v)
    函数作用域:M.new_server 对象的成员函数
    描述: 注册一个key-value值
    参数:
    - name (string): 名称
    - init_v (any): 初始值
    返回值:

    1. server_obj(table): 发布者对象
  • server:publish(name, new_value)
    函数作用域:M.new_server 对象的成员函数
    描述: 发布新值,同时通知订阅者
    参数:
    - name (string): 名称
    - new_value (any): 新值
    返回值:

client

  • M.new_client(rpc_interface)
    函数作用域:M 对象的成员函数
    描述: 创建一个订阅者对象
    参数:
    - rpc_interface (table): watch接口,需要实现send,call方法。
    返回值:
    1. client_obj(table): 订阅者对象

因为server可能是在可热更模块服务中创建,也可能在普通的skynet服务中,所有就抽象出了接口,用于适配这两种情况。

service_watch_interface.lua 在普通的skynet服务中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

local skynet = require "skynet"

local setmetatable = setmetatable

local M = {}
local mt = {__index = M}
--skynet服务 接口 传递别名或者handle_id
function M:new(name_or_handle)
local t = {
server = name_or_handle
}

setmetatable(t, mt)
return t
end

function M:send(...)
skynet.send(self.server, 'lua', ...)
end

function M:call(...)
return skynet.call(self.server, 'lua', ...)
end

return M

contriner_watch_interface.lua可热更模块服务中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
local contriner_client = require "contriner_client"
local setmetatable = setmetatable

local M = {}
local mt = {__index = M}
--可热更模块接口
function M:new(mod_name, instance_name)
local t = {
cli = contriner_client:new(mod_name, instance_name)
}

setmetatable(t, mt)
return t
end

function M:send(...)
return self.cli:mod_send(...)
end

function M:call(...)
return self.cli:mod_call(...)
end

return M
  • client:watch(name)
    函数作用域:M.new_client 对象的成员函数
    描述: 监听name
    参数:
    - name (string): 名称
    返回值:
    1. ret(bool): true

重复监听会断言

  • client:is_watch(name)
    函数作用域:M.new_client 对象的成员函数
    描述: 是否还监听了此name
    参数:
    - name (string): 名称
    返回值:

    1. ret(bool): true or false
  • client:unwatch(name)
    函数作用域:M.new_client 对象的成员函数
    描述: 取消监听
    参数:
    - name (string): 名称
    返回值:

没有监听取消会断言

  • client:get(name)
    函数作用域:M.new_client 对象的成员函数
    描述: 获取name的值
    参数:
    - name (string): 名称
    返回值:
    1. value

没有监听会断言
监听的,可能值还没有返回。

  • client:await_get(name)
    函数作用域:M.new_client 对象的成员函数
    描述: 获取name的值(至少第一次结果已经返回)
    参数:
    - name (string): 名称
    返回值:
    1. value

还没有拿到第一个值,就会一直等待,直到拿到。

  • client:await_update(name)
    函数作用域:M.new_client 对象的成员函数
    描述: 等待推送新的值,如果是可热更服务也可能是对方下线了。
    参数:
    - name (string): 名称
    返回值:
    1. value

watch_syn.lua 监听同步机制
https://huahua132.github.io/2024/01/28/skynet_fly_api/watch_syn/
作者
huahua132
发布于
2024年1月28日
许可协议