Lua-C++如何实现不停机热更
关于lua--c++之间的数据通信,堆栈相关,可以查阅:堆栈
本篇将实践一下lua如何与C++之间的不停机更新,也就是reload.
首先我们关注几个点:
1.需要更新的是哪个lua文件
2.全局表_G
3.从全局表中替换旧的lua文件(或者module)
一、test.lua
test = {} test.name = "teenwolf" function test.func (a, b) print ("func (a, b)=", a * b) return a * b end
这里定义了一个table, 名为test,同时有一个参数和一个函数
我们的目的是在C++执行起来之后,并且执行了该table,然后在某个时间点去更改test.lua的func的实现,来达到再次执行时,结果发生变化,这样的一个过程,C++执行程序是没有重新启动,一直在运行过程中。
二、reload.lua
test.lua更改之后,我们要想办法重新加载,这里就是用到了lua自带的一个_G全局表,这里面记录所有的table. 所以我们的目的是更新_G的原来旧的table,替换成更改之后的
require "test" function mainloop() local ret = test.func(10, 10) print("test.name=", test.name) end function reload_module(module_name) --临时存储旧的模块 local old_module = _G[module_name] print("old_module= ", module_name); --将加载的旧模块卸载,重新引入新的模块 package.loaded[module_name] = nil require(module_name) --获取新的模块,并且将新的模块值更新到旧的模块,并且更新package --这样能够保证已经在内存存在的旧的模块也得到更新 local new_module= _G[module_name] for k, v in pairs(new_module) do old_module[k] = v end package.loaded[module_name] = old_module end function reload() local ms = {"test"} for k, v in pairs(ms) do reload_module(v) end end
三、我们只需要在程序执行的过程中去更改test.lua文件,然后程序在不重启的时候再次调用会不会读到改动的值
lua_State* lua_state = luaL_newstate(); luaL_openlibs(lua_state); int ret = luaL_dofile(lua_state, "reload.lua"); if (ret) { std::cout << "read lua file error!" << std::endl; } //before reload lua_getglobal(lua_state, "mainloop"); lua_pcall(lua_state, 0, 0, 0); Sleep(10000); lua_getglobal(lua_state, "reload"); //lua_pushstring(lua_state, "test"); lua_pcall(lua_state, 0, 0, 0); //after reload lua_getglobal(lua_state, "mainloop"); lua_pcall(lua_state, 0, 0, 0); stackDump(lua_state); lua_close(lua_state);
我在执行过程中加了sleep,会等待10秒,我就在这10秒的之间去更改
从图中就能够看出来,热更完成!
转载请注明:少狼 – 敬畏知识的顽皮狗 » Lua-C++如何实现不停机热更
感谢狼大提供文章