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