Erlang新手进阶笔记(3) - 通用的server

分析一下之前的代码,可以注意到,server的功能其实是非常类似的,我们可以把公共的部分抽取出来,把不同的部分单独实现,做到一定程度上的复用,erlang支持动态的使用变量,例如:

Mod = my_server.
Mod:start().


这样的代码会启动my_server,借助这个功能,我们可以把模块名作为参数传入,还可以使用模块名作为进程的注册名,于是,代码就便成了这样

% my_server5.erl %
-module(my_server5).
-export([start/2,stop/1]).
-export([init/2]).
-export([request/2]).

% 启动一个模块,注册服务的名称为模块名称 %
start(Mod,Env) -> spawn(my_server5,init,[Mod,Env]).

stop(Mod) -> Mod ! stop .

%请求响应式接口,具体的实现实际上依靠Mod模块的 handle_request 方法%
request(Mod, Request) ->
Mod ! { request, self(), Request },
ok.

% 初始化服务,注册名称,启动init方法,初始化服务时接受一个参数 %
init(Mod, Env) ->
register(Mod,self()),
State = Mod:init(Env),
loop(Mod,State).

% 实际执行体 %
loop(Mod, State) ->
receive
{ request,From,Request } ->
{Res,State2} = Mod:handle_request(Request,State),
From ! {Mod, Res},
loop(Mod,State2);
stop ->
io:format("process stopped.last state is ~p~n",[State])
end.


使用这段代码,我们只要完成一个回调模块就可以了,例如:

% my_handle1.erl %
-module(my_handle1).
-export([init/1,handle_request/2]).

init(State) -> State.

handle_request(Request,State) ->
io:format("request to callback1: ~p~n",[Request]),
{"ok",State}.


运行一下——

Eshell V5.7.2  (abort with ^G)
1> c(my_server5),c(my_client),c(my_handle1).
{ok,my_handle1}
2> C = my_client:start(),my_server5:start(my_handle1,"init").
<0.49.0>
3> my_server5:request(my_handle1, "hello").
request to callback1: "hello"
ok
4> my_server5:stop(my_handle1).
process stopped.last state is "init"
stop
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值