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