Erlang代码热替换
Erlang一个非常值得称道的特性就是代码热替换(Hot Code Sawpping),我们在调用函数时,通过M:F(A)的方式,可以保证总是加载最新的代码。
在《Erlang程序设计》中E4部分,通过一个小例子展示了代码的动态加载,两个module代码如下:
1 a.erl
2
3 Erlang代码 -module(a).
4 -compile(export_all).
5 -import(b, [x/0]).
6 start(Tag) ->
7 spawn(fun() -> loop(Tag) end).
8
9 loop(Tag) ->
10 timer:sleep(3000), Val = x(),
11 io:format("Vsn1 (~p) b:x() = ~p~n", [Tag, Val]), loop(Tag).
12 -module(a).
13 -compile(export_all).
14 -import(b, [x/0]).
15
16 start(Tag) ->
17 spawn(fun() -> loop(Tag) end).
18
19 loop(Tag) ->
20 timer:sleep(3000),
21 Val = x(),
22 io:format("Vsn1 (~p) b:x() = ~p~n", [Tag, Val]),
23 loop(Tag).
24
25
26 b.erl
27
28 Erlang代码 -module(b).
29 -compile(export_all).
30
31 x() -> 1. -module(b).
32 -compile(export_all).
33
34 x() -> 1.
35
36
这个例子中是通过c(a), c(b)的方式编译修改后的a.erl 和 b.erl,这里其实是做了两件事:
1,编译module
2,load module
所以我们在这个例子中,可以看到如果我们修改了b的代码,然后在Erlang shell中通过:
c(b). 我们可以立即看到“新”的b module在运行了。
在Erlang中每个Module可以保存2个version,如果再有第三个version加入,那么首先要通过code:purse/1清理先前的版本,随后才可以load新的module。
让我们启动a module: