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

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

虽然有一个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; } 

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

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

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

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

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

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