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秒的之间去更改

    3323

    从图中就能够看出来,热更完成!

    有帮助就分享一下吧!

    转载请注明:少狼 – 敬畏知识的顽皮狗 » Lua-C++如何实现不停机热更

    喜欢 0

*

已经有1 人抢在你前面了~