今天有同事问到,能不能不关闭 skynet 进程,直接重新加载一个 lua 服务。简单的回答的不能。如果要详细回答,并非完全不行,但这个需求需要使用 skynet 的人自己定制出来。其实,这涉及服务的热更新问题。由于 lua 的函数是 first class 对象,所以,它即好做热更新,又无法做成业务完全无关的。容易做的一方面在于,lua 函数本身就是一个对象,只要你找到 lua vm 里的需要更新的函数对象被哪些地方应用,就可以生成(通过 load 新的脚本代码)新对象,取代值前的引用即可。不容易做的一方面是,lua 完全不区分什么是代码,什么是数据,所以没有 C 语言中所谓符号表。所以并没有统一的地方可以查找 lua vm 里已有的函数。甚至函数也没有名字,你不能用名字索引出新版本的函数,替换掉老版本的。除非你的业务框架做了适当的约定。另外,在 lua 中,所有函数都是闭包。如果你只想替换闭包中函数原型的实现,那么还需要做 upvalue 的重新关联。这是一个繁杂的过程,如果没有适当的约定,也无法彻底做对。btw,snax里就做了一些约定,可以一定程度的做到热更新。那么,直接把旧服务杀掉,启动一个新服务行不行?如果服务是无状态的,或是你可以在停止服务前把状态保存再安全的地方,新服务启动后可以恢复状态的话,这是个不错的思路。但是,对 skynet 框架而言,还有一个障碍:新的服务
...
继续阅读
(64)