让多个 Lua state 共享一份静态数据
如果你在同一个进程里有多个 lua state , 它们需要共享大量的只读数据, 那么可能就不希望在每个 state 启动的时候都加载和解析一遍这些数据.
所以我们需要一个共享只读数据的方法。
前段时间,我实现了一个 共享内存服务 ,这个可以保证共享内存的安全读写。不过,如果数据是只读的,那么就不需要这么复杂了。
我们只需要把数据加载到一个 lua state 中,其它的同一进程内的 state 通过 C 接口去读数据就可以了。
今天,我做了简单的实现,放在了 github 上。
目前可以支持 nil number boolean function table 的数据交换。
function 交换有一些限制,不可以绑定 upvalue 。是用 string.dump 和 load 实现的。
table 类型返回的其实是一组 key ,需要继续用 get 来读取数据。
关于线程安全:我相信只是读一个 lua state 是线程安全的。
经过 resty 同学提示,由于多线程可能同时改写 database 的 stack ,故而有安全隐患。为了解决这个问题,我预先在 database 的 state 中初始化了 32 个 thread ,这样,不同的 thread 可以用独立的 stack ,应该就线程安全了。
4 月 23 日:
旧的版本, 在企图查询一个不存在的 key 的时候, 由于 lua_pushstring
不能保证线程安全。所以我重写了全部的实现,改用 C 实现了 hash 表。这份实现的读过程是线程安全的。
Comments
Posted by: Peter | (11) October 23, 2020 06:46 PM
Posted by: zz | (10) November 21, 2016 11:32 PM
Posted by: 山西晋鑫网络 | (9) April 6, 2013 04:37 PM
Posted by: CryptFiend | (8) May 23, 2012 09:23 PM
Posted by: ed hardy uk | (7) May 15, 2012 02:29 PM
Posted by: 蒋彩阳 | (6) May 6, 2012 10:00 PM
Posted by: 无聊的时候干什么 | (5) April 26, 2012 02:43 PM
Posted by: Cloud | (4) April 20, 2012 02:17 AM
Posted by: Cloud | (3) April 20, 2012 12:33 AM
Posted by: resty | (2) April 19, 2012 11:10 PM
Posted by: linuxyu | (1) April 19, 2012 05:52 PM