lua 熱更新設想~協程


    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 )
對象

相關文章
相關標籤/搜索