首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

OTP设计准则用户手册学习笔记一:Gen_Server Behaviour

2012-09-03 
OTP设计原则用户手册学习笔记一:Gen_Server BehaviourOTP设计原则用户手册学习笔记一:Gen_Server Behaviou

OTP设计原则用户手册学习笔记一:Gen_Server Behaviour
OTP设计原则用户手册学习笔记一:Gen_Server Behaviour

%Gen_Server Behaviour(Gen_Server行为)%客户端-服务器模型通常是一个服务器和多个客户端。%通常用于资源管理系统,多个客户端共享相同的资源,%服务器则管理这些资源。%%Gen_Server Behaviour实例:%-module(gen_server_behaviour).-behaviour(gen_server).-export([start_link/0]).-export([call_type_one/1, cast_type_one/1]).-export([init/1, handle_call/3, handle_cast/2]).start_link() ->    gen_server:start_link({local, gen_server_behaviour}, gen_server_behaviour, [], []).call_type_one(Arg) ->    gen_server:call(gen_server_behaviour, {call_type_one,Arg}).cast_type_one(Arg) ->    gen_server:cast(gen_server_behaviour, {cast_type_one,Arg}).init(_Args) ->    {ok, []}.handle_call({call_type_one,Arg}, _From, State) ->    io:format("handle_call invoked,the argurment is:~p~n",[Arg]),    {reply, handle_call, State}.handle_cast({cast_type_one,Arg}, State) ->    io:format("handle_cast invoked,the argurment is:~p~n",[Arg]),    {noreply,State}.%%通过gen_server_behaviour:start_link()来启动这个Gen_Server。%start_link调用gen_server:start_link/4来启动并且链接一个新的进程,也就是一个新的gen_server。%gen_server:start_link/4的第一个参数用来注册新的gen_server。%第二个参数是gen_server的模块名。该模块包括所有的回调函数。%第三个参数是传递给回调函数init的参数。%第四个参数是选项列表,包括一些内置的启动gen_server选项。%当gen_server:start_link执行完毕,它将会调用回调函数init(_Args),init(_Args)的返回值是{ok,%State},State是gen_server的初始状态。%gen_server:start_link是同步的。%%%call_type_one(Arg)是给客户端调用的函数,他是同步调用的。%当客户调用call_type_one(Arg)时,通过gen_server:call/2来向新进程(新的gen_server)发送消息,%然后客户端等待服务器的响应。%服务器接受到gen_server:call/2发送过来的消息,将调用回调函数handle_call(Request, From, State)来响应消息。%响应完后,handle_call(Request, From, State)将会返回{reply, Reply, State1},Replay将会返回给客户,%State1则是gen_server的新的状态。%%cast_type_one(Arg)和call_type_one(Arg)差不多,只不过他是异步的,客户端不等待请求,%通过gen_server:cast/2来发送消息,通过调用handle_cast来处理消息。%%其他的回调函数还有code_change/3,handle_info/2,terminate/2。%handle_info/2用来处理其他的系统消息。比如链接进程退出消息。%gen_server退出前调用terminate/2,来释放一些资源。%%gen_server:start_link主要用来启动监控树的进程,如果想启动独立的进程,则调用gen_server:start。%这时还需要提供停止进程的回调函数,%%stop() ->%    gen_server:cast(gen_server_behaviour, stop).%%handle_cast(stop, State) ->%    {stop, normal, State}%terminate(normal, State) ->%    ok.%%实例代码的执行结果:%1> c(gen_server_behaviour).%./gen_server_behaviour.erl:10: Warning: undefined callback function code_change/3 (behaviour 'gen_server')%./gen_server_behaviour.erl:10: Warning: undefined callback function handle_info/2 (behaviour 'gen_server')%./gen_server_behaviour.erl:10: Warning: undefined callback function terminate/2 (behaviour 'gen_server')%{ok,gen_server_behaviour}%2> gen_server_behaviour:start_link().%{ok,<0.37.0>}%3> gen_server_behaviour:call_type_one(1).%handle_call invoked,the argurment is:1%handle_call%4> gen_server_behaviour:cast_type_one(1).%handle_cast invoked,the argurment is:1%ok%5> gen_server_behaviour:call_type_one(100).%handle_call invoked,the argurment is:100%handle_call


本博客由长沙办公家具赞助:www.cs163.net
更多的OTP设计原则用户手册学习笔记将发布在本人主博客上:ERLANG程序设计

热点排行