erlang代码更新知识
代码版本:--简单理解模块版本
Erlang允许加载的代码有两个版本:'current'和'old';
一个模块被加载时是'current',当再有一个版本被加载时,'current'变成'old',新加载的变成'current',此时两个版本同时存在.
对该模块新的请求执行的是新版本代码,而老代码还会被使用因为还有其他模块调用'old'版本。
如果再有第三个版本加载进来,那么需要通过code:purse/1清理'old'版本,随后可以load新模块,,这时第三个版本被加载进来,codeserver就会终止还驻留在'old'版本代码依赖的进程.
关于不同函数调用方式对触发热更的影响
1.直接调用F(A)--只存在于模块内的函数调用
2.完全限定调用M:F(A)--包括模块内以及模块之间通过import指令再直接通过函数名调用
完全限定调用总是引用当前版本代码,旧版本代码只可能通过直接调用的方式引用到
参数为模块名称返回true/false
code:purse/1//暴力,不安全
code:soft_purse/1//如果有进程占用该'old'版本代码,该版本不会被移除,返回false
interactive模式:
c(moduleName)//实质上做了两件事编译module和loadmodule
code:is_loaded(Module)->{file,Loaded}|false//判断模块是否被加载
code:load_file(a).//如果a引用了b模块,那么加载a会把b加载进来
命令行编译erl源文件:erlca.erlc
code:soft_purge(ModuleName)andalsocode:load_file(ModuleName).
/////////////////////////////////////////////////////
参考:http://blog.csdn.net/kai1379/article/details/8503066