笔记五 - gen_server

先上代码
-module(module_name).
-behaviour(gen_server).

-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).

-record(state, {}).

init([]) ->
    {ok, #state{}}.

handle_call(Request, From, State) -> %% Request最好为元组,可以多样化,带参数
    Reply = ok,
    {reply, Reply, State}.

handle_cast(Msg, State) ->
    {noreply, State}.

handle_info(Info, State) ->
    {noreply, State}.

terminate(Reason, State) ->
    ok.

code_change(OldVsn, State, Extra) ->
    {ok, State}.

 实现gen_server模式需要实现[init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]这六个接口.

 init/1 : 当start_link调用后,自己回调这个函数.
handle_call/3 :  由gen_server:call(Name, Request) 驱动 第一个参数可以是?MODULE也可以是Pid,第二个参数为元组是handle_call 的第一个参数.
handle_cast/2 :   由gen_server:cast  驱动 和  handle_call 一样.
handle_info/2 : 这个系统内部消息驱动,或者消息过来,比如send !.具体怎么个法,需深造.
terminate/2 : 当进程被终止时驱动.
code_change/3 : 当代码热更新时被驱动.

handle_call/3和handle_cast/2有什么区别,两个一样的,貌似第一个有返回值,第二个没有我们需要的返回值.

 

是不是可以自己用这种方法来封装自己的模块,方便其他地方调用,有待考察,先记一下.

-module(module_name).

%% -type ...
%% -callback ..... 这里就是回调函数,也就是继承后需要实现的接口

 

你可能感兴趣的:(erlang,gen_server)