我發起的Redis連接池redis.lua,由C調用,我得到了一個redis_lua_state
,這Lua的狀態是全球發起的一次,其他線程只能從它那裏得到。如何在多個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;
}
我想我可以維護一個引用Redis池的表,並將表傳遞給工作者的Lua狀態,在連續的Lua腳本中,接受該表作爲參數。 – coanor 2013-05-09 03:42:06
@coanor:如果這是一個Lua表,你不能那樣做。單獨的Lua州*是獨立的*。這些Redis池是Lua userdata,對不對?你不能將Lua userdata傳遞給不同的Lua狀態。 – 2013-05-09 03:43:10
我的意思是把一個表保存爲'lua_pcall'的返回值,那麼這個表的內存在C空間中,然後我將表傳遞給另一個Lua狀態,這是不可能的? – coanor 2013-05-09 03:49:35