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

时间:2013-05-09 03:04:54

标签: c lua redis

我在 redis.lua 中启动Redis连接池,通过从C调用,我得到了一个redis_lua_state,这个Lua状态是全局启动一次而其他线程只有获取< / em>来自它。

当出现HTTP请求(工作线程)时,我需要从redis_lua_state获取redis连接,然后再获取另一个Lua状态以加载其他Lua脚本,这些脚本将使用此redis连接与之通信Redis,怎么做?或者如何设计我的Lua脚本以简化它?


代码示例:

    /* on main thread, to init redis pool connection */
    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;

            /* preload */
            ret = lua_pcall(ls, 0, 0, 0);

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

            return ls;
    }

    /* worker thread */
    int worker() {
            ...
            lua_State *ls = luaL_newstate();
            ret = luaL_loadfile(ls, "run.lua");

            /* How to fetch data from g_ls? */
            ...
            lua_getglobal(ls, "run")
            ret = lua_pcall(ls, 0, 0, 0)

            lua_close(ls);
            ...
            return 0;
    }

2 个答案:

答案 0 :(得分:4)

如果你的Lua状态是分开的,那么就没有办法做到这一点。您的工作线程必须初始化Redis连接对其进行处理。

答案 1 :(得分:4)

一种方法是在C端实现Lua状态之间的复制变量。我在ERP项目中做了类似的事情,但它需要一些麻烦,特别是在复制用户数据时。

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

然后redis连接可能是互斥锁共享,所以当一个状态访问它时,另一个状态不能,例如。

当然还有访问Lua默认全局变量的问题,你也需要处理它。

或者,您可以查看Lua lanes,如果这是一个选项(我没有Redis经验,所以不知道Lua有多开放,但我看到您可以完全访问C api,它应该工作)。