我的个人博客网站云诺说上线啦!所有文章都搬到新地址了,点击围观吧!
问题:erlang热更新会kill掉还在调用'old' 代码的进程吗?
前几天在跟人讨论erlang模块热更新时对方认为不会kill掉还在调用‘old’代码的进程,原因是这会破坏掉erlang的稳定性,这样热更也就完全没有了意义!今天有时间我来写这篇博客验证下。
大家都知道erlang VM为每个模块最多保存2份代码,当前版本'current'和旧版本'old',当模块第一次被加载时,代码就是'current'版本。如果有新的代码被加载,'current'版本代码就变成了'old'版本,新的代码就成了'current'版本。erlang用两个版本共存的方法来保证任何时候总有一个版本可用,对外服务就不会停止。
测试代码如下:
-module(test).
-compile(export_all).
start() ->
Pid = spawn(fun() -> do_loop() end),
register(?MODULE, Pid).
do_loop() ->
receive
Msg ->
io:format("~p~n", [Msg])
end,
do_loop().
hot_u