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

相关推荐