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 取代这个东西。
Posted by: Cloud | (13) July 1, 2016 06:36 PM
你好,我在使用这个模块的时候出了点问题,希望能帮忙解答下。
我在我游戏进行初始化了很多表,
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)的时候会崩掉。
Posted by: niqiu | (12) July 1, 2016 06:14 PM
@wesom
;b 说得好~per user per lua_State就是一个大坑,不过看起来云风已经把坑填得差不多了
Posted by: youngshall | (11) May 5, 2014 05:37 PM
请问在lua中有没有办法知道userdata有哪些成员或方法?
Posted by: fh2002 | (10) April 10, 2014 05:05 PM
为什么会有大量的配置?
如果模块划分的好,不存在这样的问题,每个模块都只关心自身的配置。
Posted by: Felix | (9) April 8, 2014 05:14 PM
@wesom
Pbc 里的 pb 对象,如果不动态添加新协议。一直都是线程安全的。
Posted by: Cloud | (8) April 4, 2014 09:46 AM
@mos 好像是有个lua_State池,分配给各个Actor。per user per lua_State明显行不通嘛。
Posted by: Atry | (7) April 4, 2014 09:33 AM
这个方案,怎么热更新?
Posted by: Atry | (6) April 4, 2014 09:30 AM
实用,pb类型文件也需类似处理
Posted by: wesom | (5) April 2, 2014 08:51 PM
实用,pb类型文件也需类似处理
Posted by: wesom | (4) April 2, 2014 08:50 PM
云风挖了个per user per lua_state的大坑,接下来就是不断的填这个坑。
Posted by: mos | (3) April 2, 2014 06:07 PM
@shuax
有创意
Posted by: 土匪 | (2) April 2, 2014 06:06 PM
为什么不改造lua使得单虚拟机的协程能够直接并发起来呢?看起来就和现在的多虚拟机共享proto、table并发coroutine差不多。
Posted by: shuax | (1) April 2, 2014 04:21 PM