Erlang在OTP框架下的代码热更新

网上有许多说原理的,但是却找不到一个完整的在OTP框架下的有关code_change函数用法的热更新

内容参考自以下网站与OTP文档
http://www.jiancool.com/article/61163151807/

实践了一下,关键的更新代码是这样

1
2
3
4
5
6
update() ->
sys:suspend(?SERVER),
code:purge(?MODULE),
code:load_file(?MODULE),
sys:change_code(?SERVER, ?MODULE, undefined, extraData),
sys:resume(?SERVER).

首先suspend暂停线程(change_code必须在暂停状态下使用。并且,暂停状态下线程不会响应call与cast,只会响应带外消息【所以主动模式TCP/UDP通信模块没法直接更新?】)
purge清除旧的模块代码(可选,但是如果不清除旧代码,在第二次更新是会出现not_purged错误并且更新失败)(其实是清除上一次更新后遗留下来的代码)(也可使用soft_purge进行软清除)
load_file加载新的代码文件
change_code调用对应进程的对应旧模块的新版本code_change回调函数来做一些转换操作(这里一般进行state状态量从旧版本到新版本的转换操作)(P:调用的是新代码的code_change函数,所以只要每次更新时在新代码中放置从旧代码到新代码的对state变量的转换函数即可)(网上就没有说清楚这个地方的)
最后调用resume恢复进程运行