« 内存安全的 Lua api 调用 | 返回首页 | 对 skynet 的 gate 服务的重构 »

lua-conf 让配置信息在不同的 lua 虚拟机间共享

有时候我们的项目需要大量的配置表(尤其是网络游戏) 。因为主要用 lua 做开发,我们倾向于直接用 lua table 保存这些配置常量。

海量的数据有两个问题:

这些配置数据在运行期是不变的,但树型结构复杂,放在 lua 虚拟机内会生成大量的 gc object ,拖慢 lua 的垃圾收集器。因为每次扫描都需要把所有配置数据都标记一遍。

在服务器端,我们使用 skynet 框架,会启动数千个 lua 虚拟机。如果每个虚拟机都加载一份配置信息,会带来大量的内存浪费。

基于这两点,我实现了 lua-conf 这个模块。它可以把一个 lua 表转换成一个 C 对象。在 lua 中得到的是一个lightuserdata (不是 userdata ,也不能自动回收,这是因为我希望它可以被多个 lua state 共享)。

经过简单的包装,可以在语法上模拟 lua table 来访问它。weaktable 用来 cache 常用的配置数据项。

这个 C 对象的访问是线程安全的,所以你可以放心的在多线程的多个 lua state 中共享访问它。


注:lua-conf 支持的数据类型是有限的。它必须是一个无环的树型结构。key 必须是整数(除了正整数,也支持 0 或负数)或字符串。而 value 必须是 boolean string number 或 table 。

Comments

现在已经更新为 https://github.com/cloudwu/skynet/wiki/ShareData ShareData 取代这个东西。

你好,我在使用这个模块的时候出了点问题,希望能帮忙解答下。
我在我游戏进行初始化了很多表,
local cBeanCfg=conf.host.new(luaBeanCfg);
self.tableConfig[key].m_cache = conf.box(cBeanCfg),在各处逻辑都会去m_cache找到合适的数据;游戏 结束的时候我先清理了conf.host.delete(cBeanCfg)配置。但是我的主luaL_newstate_fullGC或者lua_close(L)的时候会崩掉。

@wesom
;b 说得好~per user per lua_State就是一个大坑,不过看起来云风已经把坑填得差不多了

请问在lua中有没有办法知道userdata有哪些成员或方法?

为什么会有大量的配置?
如果模块划分的好,不存在这样的问题,每个模块都只关心自身的配置。

@wesom

Pbc 里的 pb 对象,如果不动态添加新协议。一直都是线程安全的。

@mos 好像是有个lua_State池,分配给各个Actor。per user per lua_State明显行不通嘛。

这个方案,怎么热更新?

实用,pb类型文件也需类似处理

实用,pb类型文件也需类似处理

云风挖了个per user per lua_state的大坑,接下来就是不断的填这个坑。

@shuax

有创意

为什么不改造lua使得单虚拟机的协程能够直接并发起来呢?看起来就和现在的多虚拟机共享proto、table并发coroutine差不多。

Post a comment

非这个主题相关的留言请到:留言本