原创作者: 自由天堂
阅读:2982次
评论:0条
更新时间:2011-06-01
~~~~~华丽的分割线~~~~
最近老赵对C#和java进行比较的一篇博客引起了很多人的关注,但是我并不是很同意这个角度,我一直认为,一把钥匙一把锁,有明确针对性的语言是好语言,例如 erlang 之于分布式高可靠性系统,ruby 之于DSL类应用
学习Erlang的过程中,感觉它的语法其实很简单,比较强大的是它针对分布式系统所建构的基础设施,这个在语言层面和类层面都有考虑,这个系列blog就是我的学习总结。
~~~~~华丽的分割线~~~~
erlang更适合分布式服务端开发,让我们从一个服务器程序写起——
服务器需要对调用方进行响应,于是改造为
编写一个client测试一下
执行测试
这就是一个初级版本的服务器,可以看出,无论是开发还是测试,erlang写的代码都很简单。
这个服务器还很简陋的,例如,我们不能“优雅的”停止它。
那么怎样算是"优雅的"停止一个服务器?打个比方,对一个已经启动了的PC,直接拔掉电源就是“粗暴的”,而点击"开始" - “关机”,让windows自己关闭就是优雅的——这样,windows自己会决定如何释放资源,如何保护旧数据等等。
其实,服务器的所谓停止,骨子里也只是接受到了一个stop消息,真正的停止行为还是服务器自己完成的。“消息“?不错,其实就是一次receive
看代码:
进行测试
现在看起来有点像个服务器了
最近老赵对C#和java进行比较的一篇博客引起了很多人的关注,但是我并不是很同意这个角度,我一直认为,一把钥匙一把锁,有明确针对性的语言是好语言,例如 erlang 之于分布式高可靠性系统,ruby 之于DSL类应用
学习Erlang的过程中,感觉它的语法其实很简单,比较强大的是它针对分布式系统所建构的基础设施,这个在语言层面和类层面都有考虑,这个系列blog就是我的学习总结。
~~~~~华丽的分割线~~~~
erlang更适合分布式服务端开发,让我们从一个服务器程序写起——
% my_server1.erl % -module(my_server1). -export([start/0]). start() -> spawn(fun() -> loop() end). loop() -> receive Request -> io:format("server1,~p~n",[Request]), loop() end.
服务器需要对调用方进行响应,于是改造为
% my_server2.erl % -module(my_server2). -export([start/0]). start() -> spawn(fun() -> loop() end). loop() -> receive {callback,From,Request} -> io:format("server 2,~p~n",[Request]), From ! Request, loop() end.
编写一个client测试一下
% my_client % -module(my_client). -export([start/0]). start() -> spawn(fun() -> loop() end). loop() -> receive Msg -> io:format("client - ~p~n",[Msg]) end.
执行测试
Eshell V5.7.2 (abort with ^G) 1> c(my_server2),c(my_client). {ok,my_client} 2> C = my_client:start(),S = my_server2:start(). 3> S ! { callback, C, "hello" }. server 2,"hello" {callback,<0.88.0>,"hello"} client - "hello"
这就是一个初级版本的服务器,可以看出,无论是开发还是测试,erlang写的代码都很简单。
这个服务器还很简陋的,例如,我们不能“优雅的”停止它。
那么怎样算是"优雅的"停止一个服务器?打个比方,对一个已经启动了的PC,直接拔掉电源就是“粗暴的”,而点击"开始" - “关机”,让windows自己关闭就是优雅的——这样,windows自己会决定如何释放资源,如何保护旧数据等等。
其实,服务器的所谓停止,骨子里也只是接受到了一个stop消息,真正的停止行为还是服务器自己完成的。“消息“?不错,其实就是一次receive
看代码:
% my_server3.erl % -module(my_server3). -export([start/0]). start() -> spawn(fun() -> loop() end). loop() -> receive {callback,From,Request} -> Response = deal_with(Request), From ! Response, loop(); {stop} -> io:format("server3 stopped~n") end. deal_with(Request) -> io:format("server3 - ~p~n",[Request]), "response".
进行测试
Eshell V5.7.2 (abort with ^G) 1> c(my_server3),c(my_client). {ok,my_client} 2> C = my_client:start(),S = my_server3:start(). <0.45.0> 3> S ! { callback, C, "hello" }. server3 - "hello" {callback,<0.44.0>,"hello"} client - "response" 4> S ! {stop}. server3 stopped {stop}
现在看起来有点像个服务器了
评论 共 0 条 请登录后发表评论