ERLANG/OTP学习 Day1

Erlang中OTP

具有较高的生产效率,可以在短时间内交付产品级的系统;具有较高的稳定性,OTP能够对来自于行为本身提供很高的容错性,具有可拓展性,动态代码提升等属性。Erlang

Server 1:基本的服务器:

server1.erl:

-module(server1).
-author("chen").

%% API
-export([start/2, rpc/2]).

start(Name,Mod) ->
  register(Name,spawn(fun()->loop(Name,Mod,Mod:init()) end)).
rpc(Name,Request) ->
  Name ! {self(),Request},
  receive
    {Name,Response} ->Response
  end.
loop(Name,Mod,State) ->
  receive
    {From,Request} ->
      {Response,State1}=Mod:handle(Request,State),
      From ! {Name,Response},
      loop(Name,Mod,State1)
  end.

name_server.erl :

-module(name_server).
-author("chen").

%% API
-export([add/2, find/1, init/0, handle/2]).
-import(server1,[rpc/2]).

%%客户端方法
add(Name,Place) -> rpc(name_server,{add,Name,Place}).
find(Name)      -> rpc(name_server,{find,Name}).

%%回调方法
init() ->dict:new().
handle({add,Name,Place},Dict) -> {ok,dict:store(Name,Place,Dict)};
handle({find,Name},Dict)      -> {dict:find(Name,Dict),Dict}.

在server1.erl中回调的模块作为它的参数,在name_server.erl中既可以被服务器充当调用的回调模块,也可以被客户端调用。

运行结果:

Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit:ns]

Eshell V14.0.2 (press Ctrl+G to abort, type help(). for help)
1> server1:start(name_server,name_server).
true
2> name_server:add(tom,"at home").
ok
3> name_server:find(tom).
{ok,"at home"}

Server 2:实现事务的服务器

server2.erl

-module(server2).
-author("chen").

%% API
-export([]).

-export([start/2, rpc/2]).

start(Name,Mod) ->
  register(Name,spawn(fun()->loop(Name,Mod,Mod:init()) end)).
rpc(Name,Request) ->
  Name ! {self(),Request},
  receive
    {Name,crash} ->exit(rpc);
    {Name,ok,Response}->Response
  end.

loop(Name,Mod,OldState) ->
  receive
    {From,Request}->
      try
          Mod:handle(Request,OldState) of
        {Response,NewState}->
          From ! {Name,ok,Response},
          loop(Name,Mod,NewState)
      catch
          _:Why  ->
            log_the_error(Name,Request,Why),
            From ! {Name,crash},
            loop(Name,Mod,OldState)
      end
  end.

log_the_error(Name,Request,Why)->
  io:format("Server ~p request ~p ~n""caused exception ~p ~n",[Name,Request,Why]).


server2.erl中在处理函数时如果抛出错误时会使用State的初始状态使循环继续,当函数处理成功时,会使用函数提供的NewState来继续循环;当函数处理失败时,服务器会向客户端发送消息使其崩溃,其他的客户端则不受影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值