- 浏览: 333379 次
- 性别:
- 来自: 北京
最新评论
-
perfect_control:
真的很详细,一些东西很容易被我忽略掉了
使用fprof进行性能分析 -
leeyisoft:
http://www.erlangqa.com/ 怎么变成 “ ...
Erlang问答网站,欢迎各位提出问题,解答问题。 -
simsunny22:
4年之后我才看到 慢慢的干货
Erlang服务器内存耗尽bug跟踪过程 -
爱死我:
...
使用etop查看系统中进程信息 -
宋兵甲:
在跑这个服务的时候,每秒建立一个客户端连接,连续建立10000 ...
自己写一个tcp 通用服务器
Erlang一个非常值得称道的特性就是代码热替换(Hot Code Sawpping),我们在调用函数时,通过M:F(A)的方式,可以保证总是加载最新的代码。
在《Erlang程序设计》中E4部分,通过一个小例子展示了代码的动态加载,两个module代码如下:
a.erl
b.erl
这个例子中是通过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。
在Erlang内部,当有新的Module被调用时,旧的Module的Export 函数将被新的Export函数代替,因此当我们实用M:F(A)的方式调用函数时,将调用最新代码。
让我们启动a module:
随后我们修改a.erl:
然后编译a.erl:
当前,在Erlang中只有Vsn1版本的a,回到erlang shell中,加载Vsn2:
现在在Erlang中有Vsn1和Vsn2两个版本的a module。
我们在启动一个新的a process:
好了让我们再次修改a.erl:
然后编译a.erl:
注意:此时Erlang shell中并没有加载Vsn3版本的代码,因为我们没有使用c(a)的方式编译加载a module。我们可以测试一下:
毫无疑问,还是Vsn2
接下来我们想加载Vsn3版本的a,回到Erlang shell:
oh,产生了一个错误信息,返回{error,not_purged},现在已经有Vsn1,Vsn2两个a module了,这第三个被拒绝了。我们必须调用code:purge/1清除Vsn1:
返回true,同时Vsn1版本的a process已经被kill了,现在只有Vsn2了。接下来加载我们的Vsn3吧:
好了Vsn2成了旧版本,Vsn3成了新版本。
自己动手实验一下吧!
Update:
code:soft_purge(Module),如果没有process运行旧的Module,则返回true(表明此Module可以被温和的purge);否则返回false。
可以通过erlang:check_process_code(Pid, Module)检测Process是否运行某个Module的Old version,这个检测不会检测process的运行时,判断当前函数是否为old
请注意:code:purge 和 code:soft_purge 针对的是old version,如果当前module只有一个version,那么 purge返回false, soft_purge返回true.
在《Erlang程序设计》中E4部分,通过一个小例子展示了代码的动态加载,两个module代码如下:
a.erl
-module(a). -compile(export_all). -import(b, [x/0]). start(Tag) -> spawn(fun() -> loop(Tag) end). loop(Tag) -> timer:sleep(3000), Val = x(), io:format("Vsn1 (~p) b:x() = ~p~n", [Tag, Val]), loop(Tag).
b.erl
-module(b). -compile(export_all). x() -> 1.
这个例子中是通过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。
在Erlang内部,当有新的Module被调用时,旧的Module的Export 函数将被新的Export函数代替,因此当我们实用M:F(A)的方式调用函数时,将调用最新代码。
让我们启动a module:
> a:start(one). Vsn1 (one) b:x() = 1
随后我们修改a.erl:
-io:format("Vsn1 (~p) b:x() = ~p~n", [Tag, Val]), +io:format("Vsn2 (~p) b:x() = ~p~n", [Tag, Val]),
然后编译a.erl:
$ erlc a.erl
当前,在Erlang中只有Vsn1版本的a,回到erlang shell中,加载Vsn2:
> code:load_file(a).
现在在Erlang中有Vsn1和Vsn2两个版本的a module。
我们在启动一个新的a process:
> a:start(two). Vsn2 (two) b:x() =1
好了让我们再次修改a.erl:
-io:format("Vsn2 (~p) b:x() = ~p~n", [Tag, Val]), +io:format("Vsn3 (~p) b:x() = ~p~n", [Tag, Val]),
然后编译a.erl:
$ erlc a.erl
注意:此时Erlang shell中并没有加载Vsn3版本的代码,因为我们没有使用c(a)的方式编译加载a module。我们可以测试一下:
>a:start(three). <0.38.0> Vsn2 (three) b:x() = 1
毫无疑问,还是Vsn2
接下来我们想加载Vsn3版本的a,回到Erlang shell:
> code:load_file(a). =ERROR REPORT==== 14-Jan-2009::23:16:23 === Loading of /home/litao/erl/a.beam failed: not_purged {error,not_purged} =ERROR REPORT==== 14-Jan-2009::23:16:23 === Module a must be purged before loading
oh,产生了一个错误信息,返回{error,not_purged},现在已经有Vsn1,Vsn2两个a module了,这第三个被拒绝了。我们必须调用code:purge/1清除Vsn1:
> code:purge(a). true Vsn2 (three) b:x() = 1 Vsn2 (two) b:x() = 1
返回true,同时Vsn1版本的a process已经被kill了,现在只有Vsn2了。接下来加载我们的Vsn3吧:
> code:load_file(a). {module,a} Vsn2 (two) b:x() = 1 Vsn2 (three) b:x() = 1 8> a:start(five). <0.43.0> Vsn2 (three) b:x() = 1 Vsn2 (two) b:x() = 1 Vsn3 (five) b:x() = 1
好了Vsn2成了旧版本,Vsn3成了新版本。
自己动手实验一下吧!
Update:
code:soft_purge(Module),如果没有process运行旧的Module,则返回true(表明此Module可以被温和的purge);否则返回false。
可以通过erlang:check_process_code(Pid, Module)检测Process是否运行某个Module的Old version,这个检测不会检测process的运行时,判断当前函数是否为old
请注意:code:purge 和 code:soft_purge 针对的是old version,如果当前module只有一个version,那么 purge返回false, soft_purge返回true.
评论
3 楼
pascal4123
2009-02-24
好文字.
litaocheng 写道
Erlang一个非常值得称道的特性就是代码热替换(Hot Code Sawpping),我们在调用函数时,通过M:F(A)的方式,可以保证总是加载最新的代码。
在《Erlang程序设计》中E4部分,通过一个小例子展示了代码的动态加载,两个module代码如下:
a.erl
b.erl
这个例子中是通过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。
在Erlang内部,当有新的Module被调用时,旧的Module的Export 函数将被新的Export函数代替,因此当我们实用M:F(A)的方式调用函数时,将调用最新代码。
让我们启动a module:
随后我们修改a.erl:
然后编译a.erl:
当前,在Erlang中只有Vsn1版本的a,回到erlang shell中,加载Vsn2:
现在在Erlang中有Vsn1和Vsn2两个版本的a module。
我们在启动一个新的a process:
好了让我们再次修改a.erl:
然后编译a.erl:
注意:此时Erlang shell中并没有加载Vsn3版本的代码,因为我们没有使用c(a)的方式编译加载a module。我们可以测试一下:
毫无疑问,还是Vsn2
接下来我们想加载Vsn3版本的a,回到Erlang shell:
oh,产生了一个错误信息,返回{error,not_purged},现在已经有Vsn1,Vsn2两个a module了,这第三个被拒绝了。我们必须调用code:purge/1清除Vsn1:
返回true,同时Vsn1版本的a process已经被kill了,现在只有Vsn2了。接下来加载我们的Vsn3吧:
好了Vsn2成了旧版本,Vsn3成了新版本。
自己动手实验一下吧!
在《Erlang程序设计》中E4部分,通过一个小例子展示了代码的动态加载,两个module代码如下:
a.erl
-module(a). -compile(export_all). -import(b, [x/0]). start(Tag) -> spawn(fun() -> loop(Tag) end). loop(Tag) -> timer:sleep(3000), Val = x(), io:format("Vsn1 (~p) b:x() = ~p~n", [Tag, Val]), loop(Tag).
b.erl
-module(b). -compile(export_all). x() -> 1.
这个例子中是通过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。
在Erlang内部,当有新的Module被调用时,旧的Module的Export 函数将被新的Export函数代替,因此当我们实用M:F(A)的方式调用函数时,将调用最新代码。
让我们启动a module:
> a:start(one). Vsn1 (one) b:x() = 1
随后我们修改a.erl:
-io:format("Vsn1 (~p) b:x() = ~p~n", [Tag, Val]), +io:format("Vsn2 (~p) b:x() = ~p~n", [Tag, Val]),
然后编译a.erl:
$ erlc a.erl
当前,在Erlang中只有Vsn1版本的a,回到erlang shell中,加载Vsn2:
> code:load_file(a).
现在在Erlang中有Vsn1和Vsn2两个版本的a module。
我们在启动一个新的a process:
> a:start(two). Vsn2 (two) b:x() =1
好了让我们再次修改a.erl:
-io:format("Vsn2 (~p) b:x() = ~p~n", [Tag, Val]), +io:format("Vsn3 (~p) b:x() = ~p~n", [Tag, Val]),
然后编译a.erl:
$ erlc a.erl
注意:此时Erlang shell中并没有加载Vsn3版本的代码,因为我们没有使用c(a)的方式编译加载a module。我们可以测试一下:
>a:start(three). <0.38.0> Vsn2 (three) b:x() = 1
毫无疑问,还是Vsn2
接下来我们想加载Vsn3版本的a,回到Erlang shell:
> code:load_file(a). =ERROR REPORT==== 14-Jan-2009::23:16:23 === Loading of /home/litao/erl/a.beam failed: not_purged {error,not_purged} =ERROR REPORT==== 14-Jan-2009::23:16:23 === Module a must be purged before loading
oh,产生了一个错误信息,返回{error,not_purged},现在已经有Vsn1,Vsn2两个a module了,这第三个被拒绝了。我们必须调用code:purge/1清除Vsn1:
> code:purge(a). true Vsn2 (three) b:x() = 1 Vsn2 (two) b:x() = 1
返回true,同时Vsn1版本的a process已经被kill了,现在只有Vsn2了。接下来加载我们的Vsn3吧:
> code:load_file(a). {module,a} Vsn2 (two) b:x() = 1 Vsn2 (three) b:x() = 1 8> a:start(five). <0.43.0> Vsn2 (three) b:x() = 1 Vsn2 (two) b:x() = 1 Vsn3 (five) b:x() = 1
好了Vsn2成了旧版本,Vsn3成了新版本。
自己动手实验一下吧!
2 楼
mryufeng
2009-01-16
可以再研究下动态库模块代码热替换!
1 楼
tooor
2009-01-15
恩, 又加深一遍印象, 加油
发表评论
-
Erlang问答网站,欢迎各位提出问题,解答问题。
2012-03-18 15:07 5232平时收到很多关于Erlang的问题,我都尽量一一解答,可是时间 ... -
Emakefile并行编译
2011-11-17 13:15 7604项目代码越来越多,使用erlang编译也越来越慢。无论是Mak ... -
Erlang服务器内存耗尽bug跟踪过程
2011-10-25 21:44 21726本文描述朋友Erlang服务器内存耗尽bug的解决过程 ... -
inet:getstat/2小用法
2011-04-27 09:32 4549inet:getstat/2的用处 在 ... -
Erlang游戏开发-协议
2011-04-22 16:10 10680Erlang游戏开发-协议 ... -
Gearman Erlang Client
2010-10-17 21:14 3680Gearman Gearman是一个通用的任务调度框架。 ... -
ECUG归来
2010-10-17 21:02 2940今天ECUG V圆满结束了,不知不觉作为讲师已经参加过3次大会 ... -
gen-erl-app快速生成erlang app 框架
2010-04-07 14:22 3950经常需要创建各种erlang app,这个过程一旦掌握,就很繁 ... -
erl-redis发布
2010-03-30 11:44 5761最近几天因为需要,实现了一个redis erlang clie ... -
用Erlang做了很多事
2010-01-19 14:08 5041因为工作及时间关系,最近比较忙碌,没有太多的时间写文章。 ... -
ecug topic - erlang开发实践
2009-11-11 10:04 3717从ecug归来,感觉不错,大家学习探讨的积极性很高哦。 很高 ... -
reltool用户指南
2009-11-02 22:27 6304说明,最近比较忙,没有太多时间更新blog,请各位朋友谅解. ... -
Erlang定时任务server (仿crontab语法)
2009-09-23 18:03 6297好久不写blog了,看到yufeng老大那么活跃,我也“耐不住 ... -
Erlang进程之错?
2009-07-27 15:06 3655前阵子erlang-china关于erla ... -
CNode指南
2009-07-27 14:13 3289好久不发文章,因为工作太忙。这个东西就凑凑数吧。各位见谅。 ... -
Erlang类型及函数声明规格
2009-06-08 22:41 9485Erlang类型及函数声明 ... -
使用etop查看系统中进程信息
2009-05-29 13:57 6100Erlang提供了丰富的开发工具,你认为没有的时候,很可能是你 ... -
创建gen_server组解决单process瓶颈
2009-05-27 17:05 5217并发和顺序是一个令人 ... -
又有人投入Erlang的怀抱了:37Signals Campfire loves Erlang
2009-05-14 23:00 3581就喜欢看这样的东西... This is so juicy ... -
list random shuffle实现
2009-05-07 13:41 4321在项目中需要对list进行随机shuffle,但是在erlan ...
相关推荐
视频+例子,这是才litaocheng文章和fengyu的帮助下完成的
NULL 博文链接:https://langzhe.iteye.com/blog/682425
erlang并发编程实战源代码erlang并发编程实战源代码
看到另外两个分好高,我把另外两个二合一啦。远古封神+英雄远征的ERLANG游戏服务器代码,看过了,感觉不错的。
Erlang 中的Module级别热部署
kmp游戏中使用频率较高,所以用erlang代码代码实现,效率还行。
[Erlang程序设计]源代码,包括了erlang程序设计一书全部实例代码;
使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级
● 热代码升级-Erlang允许程序代码在运行系统中被修改。旧代码能被逐步淘汰而后被新代码替换。在此过渡期间,新旧代码是共存的。 ●递增式代码装载-用户能够控制代码如何被装载的细节。 ●外部接口-Erlang进程与外部...
Erlang 新的语言,配套资料的源代码,可以操练一下。
二郎助手,专为erlang语言开发的开发工具。完全免费,源代码开源(VS2005开发)。
erlang otp in action 代码
Joe Armstrong [Erlang程序设计].中文版 和随书源代码 一本不错的Erlang学习书籍!
Erlang程序设计第2版附书代码,结合Erlang程序设计第2版边看书,边测试代码,效果好。
对文件进行遍历,以行为单位进行输出,没一行构成一个列表元素,最终拼成一个列表。
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
● 热代码升级-Erlang允许程序代码在运行系统中被修改。旧代码能被逐步淘汰而后被新代码替换。在此过渡期间,新旧代码是共存的。 ●递增式代码装载-用户能够控制代码如何被装载的细节。 ●外部接口-Erlang...
对Erlang的一些常用的开发或调试工具进行了介绍
里面包含Server端Erlang代码和Client端JAVA代码。编写过程在我博客里。