lua热更新的方式大多都以从新加载文件来更新代码,这方面在百度上能够找不到很多,无非是 _G 和package.loaded 的清理这部分就不在这里说了。
并发
当咱们在使用lua作服务端的逻辑开发语言时时常会用到协程来处理并发和异步调用这程方式可让代码更新易理解组织
异步
可是当咱们在处理热理新问题时以上咱们清理的_G和package.loaded 有被协程用到的表就不能彻底的清理因来协程入口函数提默认会使用建立时的全局环境此时会增长一次引用 直到协程结束。函数
当更新时有未结束的协程那这时这些协程不能获得更新,更新可能这些旧协程向下执时会加载到新的代码而产生混合的协程执行的结果未知。
测试
可先的方法就是等到没有旧协程时更新可是又不能及时更新。lua
而我想及时更新,并确保更新的效果,而之因此不能在有旧协程时更新最不但愿就是出现混合若是可以保证旧协程的执行逻辑,而新协程又能彻底按更新的逻辑执行那么只能保存旧的环境与级有须要加载的全部模块,能够在加载模块时作处理保留模块引用,而后设置协程入口函数的环境( setfenv(func,tab) )固化协程执行环境。spa
具休能够参见http://stackoverflow.com/questions/17563373/lua-setfenv-on-threads-doesnt-seem-to-work协程
其中对协程对象设置环境我测试时没有起作用(luajit 2.0.3 osx )
对象