脚本的热更新的流程都大同小异, 第一步先保存旧代码的块的数据, 第二部加载新的代码块,第三步将旧代码块的局部和全局数据拷贝到新代码块的对应的

变量中。

在服务器热更新中,主要考虑热更的内容是什么, 一般更新分两种,一种是逻辑的更新,一种是变量的值更新。

先谈论第一种,在lua 5.3中,继承了新的debug.upvaluejoin(f1, i, f2, j)函数,能将函数f1的第i个个upvalue引用f2的第j个upvalue,

可以通过debug.getupvalue函数,获取ENV 的upvalue来的索引位置,找到该位置后,可以通过debug.upvaluejoin函数来实现env的交换。

第二种就是要更新变量值,lua中的变量值更新,除了table外,其它变量类型都可以通过直接赋值来改变值的大小。由于table的回收,会导致其它引用

该table的变量都会收到影响,会导致错误的发生,所以, table的值更新,不能通过直接赋值, 可以通过移除table里面的所有元素的值,table的table除外,

然后将新table的所有元素的值遍历赋值给旧的table,注意的是不能将table也赋值,如果新table里有新的子元素是table类型,必须要在旧table对应值里重新

创建一个新的table,递归将值拷贝。

以下是table的拷贝方法实现热更的过程:

HotFixTable = {}

-- copy a old table's all key and value  to new table, but don't release old table
local function copyTable( oldTbl, newTbl)
for k, v in pairs(newTbl) do
if type(v) == "table" then
if type(oldTbl[k]) ~= "table" then
oldTbl[k] = {}
end
copyTable( oldTbl[k], v)
else
oldTbl[k] = v
end
end
return oldTbl, newTbl
end --table no need release
local function clearTable(tbl)
for k, v in pairs(tbl) do
if type(v) ~= "table" then
tbl[k] = nil
else
clearTable(v)
end
end return tbl
end --use file to hotfix the source table
function HotFixTable.hotFixByFileName(fileName, sourceTbl)
local deskTbl
local function newIndexFunc(tbl, name, value)--t:table, name:key, f:function
deskTbl = value
end local dummy_env = setmetatable({}, { __newindex = newIndexFunc })
local f, err = loadfile(fileName, "bt", dummy_env)
if f then
local ok, err = pcall(f)
assert(ok, err)
if ok then
clearTable(sourceTbl)
copyTable(sourceTbl, deskTbl)
end
end
end --use lua string to hotfix the table
function HotFixTable.hotFixByData(hitfixContent, sourceTbl)
local deskTbl
local function newIndexFunc(tbl, name, value)--t:table, name:key, f:function
deskTbl = value
end local dummy_env = setmetatable({}, { __newindex = newIndexFunc })
local f, err = load(hitfixContent, "=patch", "bt", dummy_env)
if f then
local ok, err = pcall(f)
assert(ok, err)
if ok then
clearTable(sourceTbl)
copyTable(sourceTbl, deskTbl)
end
end
end

调用方法如下:

HotFixTable.hotFixByFileName("新table的保存所在文件", 旧table)

关于lua 5.3 服务端热更新流程的更多相关文章

  1. webpack快速入门——配置文件:服务和热更新

    1.在终端安装 cnpm i webpack-dev-server --save-dev 2.配置好后执行 webpack-dev-server,这时候会报错 出现错误,只需要在pagejson里配置 ...

  2. 背水一战 Windows 10 (112) - 通知(Badge): application 的 badge 通知, secondary 的 badge 通知, 轮询服务端以更新 badge 通知

    [源码下载] 背水一战 Windows 10 (112) - 通知(Badge): application 的 badge 通知, secondary 的 badge 通知, 轮询服务端以更新 bad ...

  3. 背水一战 Windows 10 (109) - 通知(Tile): 按计划显示 tile 通知, 轮询服务端以更新 tile 通知

    [源码下载] 背水一战 Windows 10 (109) - 通知(Tile): 按计划显示 tile 通知, 轮询服务端以更新 tile 通知 作者:webabcd 介绍背水一战 Windows 1 ...

  4. netty服务端客户端启动流程分析

    服务端启动流程 我们回顾前面讲解的netty启动流程,服务端这边有两个EventLoopGroup,一个专门用来处理连接,一个用来处理后续的io事件 服务端启动还是跟nio一样,绑定端口进行监听,我们 ...

  5. 移动端热更新方案(iOS+Android)

    PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...

  6. asp.net mvc bootstrap datatable 服务端分页 更新槽糕的代码【1】

    datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 datatable 1.10.7 百度云下载  密码:0ea1 先上图[ jqueryui风格] ...

  7. udp服务端收发数据流程

    1.创建服务端的socket以便开始通讯.2.绑定ip以及端口号,这样客户端才能找到这个程序.3.因为本地网卡不止一个所以尽量不写死,一般用""空来表示所有本地网卡.4.接下来开始 ...

  8. hadoop rpc协议客户端与服务端的交互流程

    尽管这里是hadoop的rpc服务,但是hadoop还是做到了一次连接仅有一次认证.具体的流程待我慢慢道来. 客户端:这里我们假设ConnectionId对应的Connection并不存在.在调用ge ...

  9. 浏览器与服务端请求响应流程与HTTP协议

    浏览器与服务端请求响应流程图: 1.HTTP概要 1.1. 定义 HTTP(HyperText Transfer  Protocol,超文本传输协议)最早就是计算机与计算机之间沟通的一种标准协议,这种 ...

随机推荐

  1. FileUtils简化你的文件操作

    前言: 在工作当中我们往往遇到很多文件的操作,我们也习惯写一些自己定义的工具类来简化文件操作,其实apache的commons的FileUtils类就是这样一个工具类,使用它能大大的简化我们对文件的操 ...

  2. iphone状态栏,导航栏,标签栏高度一览表

    iphone状态栏,导航栏,标签栏高度一览表   设备分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus  1242×2208 px 60px  132px  147px iPhon ...

  3. AtCoder Beginner Contest 071 ABCD

    1001 求个绝对值比较大小喽 1002 把字符串出现的字母记录一下,然后遍历a-z,谁第一个没出现就输出谁 1003 Problem Statement We have N sticks with ...

  4. angular4和asp.net core 2 web api

    angular4和asp.net core 2 web api 这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net ...

  5. 056 Merge Intervals 合并区间

    给出一个区间的集合, 请合并所有重叠的区间.示例:给出 [1,3],[2,6],[8,10],[15,18],返回 [1,6],[8,10],[15,18].详见:https://leetcode.c ...

  6. Azkaban2.5安装部署(系统时区设置 + 安装和配置mysql + Azkaban Web Server 安装 + Azkaban Executor Server安装 + Azkaban web server插件安装 + Azkaban Executor Server 插件安装)(博主推荐)(五)

    Azkaban是什么?(一) Azkaban的功能特点(二) Azkaban的架构(三) Hadoop工作流引擎之Azkaban与Oozie对比(四) 不多说,直接上干货! http://www.cn ...

  7. Linux用脚本守护进程

    while true; do server=`ps -aux | grep tomcat | grep -v grep` if [ ! "$server" ]; then echo ...

  8. 完整uploadify批量上传文件插件使用

    1.首先准备uploadify的js文件,网上一搜一大堆 2.上传页面UpFilePage.aspx 关键代码: <html xmlns="http://www.w3.org/1999 ...

  9. 总结一下WindowListener的用法

    记录一下便于自己查看 1.WindowListener java.awt.event 接口 WindowListener public interface WindowListener extends ...

  10. .net core 的跨域

    .net core 的跨域问题花了 我很长时间 接下来我简单的描述下解决过程 首先我在前端用jquery的ajax去调用自己的本地接口大致如下 $.ajax({ type:"POST&quo ...