使用的较多的热更新库是 https://github.com/mochi/mochiweb/blob/master/src/reloader.erl
取自mochiweb中的reloader文件
1.reloader会启动一个gen_server进程,在init的时候会启动一个定时器
定时调用doit
2.doit
doit会先列出所有加载过的文件,尝试用file:read_file_info读取文件信息
Mtime:文件最后一次修改的本地时间
From: 最后一次热更新完的时间
To: 现在的时间
如果读取成功,从file_info record中取出mtime
若Mtime >= From 以及 Mtime < To 说明文件有改动,切尚未热更
执行reload
3.reload
热更新流程大体分为两步
首先code:purge() ,这里有一个类似的函数code:soft_purge
两个函数的作用都是清除erlang文件中老版本的代码,但是此时如果有进程在执行老版本的代码,两个函数有不同的处理方式
code:purge 会直接杀掉函数,code:soft_purge 则是会放弃执行,
两种方法都会有问题,第一种可能会让关键进程崩溃,第二种会热更失败
当然,官方也提供了解决的办法,
对于自建的普通进程,在热更的时候,执行一次外部调用,就能更新代码,例如m:loop()
如果进程是behaviour进程,比如(gen_server,gen_statem等)则不用担心此问题,内部已经解决的此问题
最后一步就是 code:load_file,加载新版本的代码,此时如果老版本代码没有清除会报错