如何在多个Lua State(多线程)之间传递数据?

我在 redis.lua 中通过从 C 调用初始化 Redis 连接池,得到一个 redis_lua_state,这个 Lua 状态是全局初始化的,其他线程只能从中 _获取_。

当有一个 HTTP 请求(工作线程)到来时,我需要从 redis_lua_state 中获取一个 redis 连接,然后新建另一个 Lua 状态来加载其他 Lua 脚本,并使用这个 redis 连接与 Redis 进行通信,如何做到这一点?或者如何设计我的 Lua 脚本使它更简单?


代码示例:

    /* 在主线程中,初始化 Redis 连接池 */
    lua_State *g_ls = NULL;
    lua_State *init_redis_pool(void) {
            int ret = 0;
            g_ls = luaL_newstate();
            lua_State *ls = g_ls;

            luaL_openlibs(ls);
            ret = luaL_loadfile(ls, "redis.lua");
            const char *err;
            (void)err;

            /* 预加载 */
            ret = lua_pcall(ls, 0, 0, 0);

            lua_getglobal(ls, "init_redis_pool");
            ret = lua_pcall(ls, 0, 0, 0);

            return ls;
    }

    /* 工作线程 */
    int worker() {
            ...
            lua_State *ls = luaL_newstate();
            ret = luaL_loadfile(ls, "run.lua");

            /* 如何从 ls 中获取 g_ls 中的数据? */
            ...
            lua_getglobal(ls, "run")
            ret = lua_pcall(ls, 0, 0, 0)

            lua_close(ls);
            ...
            return 0;
    }
点赞
用户734069
用户734069

如果你的 Lua 状态是分开的,那么没有办法做到这一点。你的工作线程将不得不初始化 Redis 连接并在其上进行处理。

2013-05-09 03:29:36
用户2198692
用户2198692

一种实现方式是在 C 侧实现 Lua 状态之间的变量复制。我在我的企业资源计划项目中也做了类似的事情,但是复制用户数据时需要一些麻烦。

我的做法是实现一种类似于超级全局变量的系统(在我的实例中是一个 C 类),实现为全局表的 __index__newindex 代理到默认 Lua 全局表。设置全局变量时,__newindex 会将变量复制到超级全局变量中。当另一个 Lua 状态尝试访问该全局变量时,它会从相同结构中检索。

然后,redis 连接可以是互斥锁共享的,因此当一个状态访问它时,另一个状态就不能访问它。

当然还有访问 Lua 默认全局变量的问题也要注意。

或者,如果有此选项,您可以查看 Lua lanes。我没有 Redis 经验,所以不知道 Lua 有多开放,但我看到您可以完全访问 C API,所以应该可以工作。

2013-05-09 05:19:40