今天终于理解了gen_server行为模式。
这里放一个模版,以方便自己使用:
-module(test8).
-behaviour(gen_server).
-export([start_link/0,stop_link/0]).
-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3]).
-define(SERVER,?MODULE).
%% 不知道这个state的作用是什么
-record(state,{}).
%% 给外面调用的。
%%% ----------------------------------------------
%%% 公开的API
%%%
%%% ----------------------------------------------
start_link()->
gen_server:start_link({local,?SERVER},?MODULE,[],[]).
stop_link()->
gen_server:cast(?SERVER,stop).
%%% ---------------------------------------------
%%% 私有函数
%%% ---------------------------------------------
%%% -------------------------------------------
%%% 以下是回调函数
%%% -------------------------------------------
%% Result = {ok,State} | {ok,State,Timeout} | {ok,State,hibernate}
%% | {stop,Reason} | ignore
%% 这里设置timeout为0,根据<<erlang并发编程>>描述,可以让init/1尽快结束,是一个众所周知的技巧。
init([])->
{ok,#state{},0}.
%% Result = {reply,Reply,NewState} | {reply,Reply,NewState,Timeout}
%% | {reply,Reply,NewState,hibernate}
%% | {noreply,NewState} | {noreply,NewState,Timeout}
%% | {noreply,NewState,hibernate}
%% | {stop,Reason,Reply,NewState} | {stop,Reason,NewState}
handle_call(Request,From,State)->
Reply=ok,
{reply,Reply,State}.
%% Result = {noreply,NewState} | {noreply,NewState,Timeout}
%% | {noreply,NewState,hibernate}
%% | {stop,Reason,NewState}
handle_cast(Request,State)->
case Request of
stop -> {stop,normal,State};
_ -> {noreplay,State}
end.
%% Result = {noreply,NewState} | {noreply,NewState,Timeout}
%% | {noreply,NewState,hibernate}
%% | {stop,Reason,NewState}
handle_info(Info,State)->
{noreply,State}.
terminate(Reason,State)->
io:format("server is stopped"),
ok.
code_change(OldVsn,State,Extra)->
{ok,State}.
0 条评论。