我在 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;
}
答案 0 :(得分:4)
如果你的Lua状态是分开的,那么就没有办法做到这一点。您的工作线程必须初始化Redis连接和对其进行处理。
答案 1 :(得分:4)
一种方法是在C端实现Lua状态之间的复制变量。我在ERP项目中做了类似的事情,但它需要一些麻烦,特别是在复制用户数据时。
我所做的是实现某种超级全局变量(我的实例中的C类)系统,该系统实现为全局表的__index
和__newindex
,它是默认的代理Lua全球表。设置全局变量时,__newindex
会将其复制到该超级全局变量。当另一个Lua状态试图访问该全局时,它将从相同的结构中检索它。
然后redis连接可能是互斥锁共享,所以当一个状态访问它时,另一个状态不能,例如。
当然还有访问Lua默认全局变量的问题,你也需要处理它。
或者,您可以查看Lua lanes,如果这是一个选项(我没有Redis经验,所以不知道Lua有多开放,但我看到您可以完全访问C api,它应该工作)。