• gen_server的一些心得


    gen_server并不是我原来概念中的tcp_server或者udp_server的概念,只是一个纯粹的消息服务器,另外,附上它的一些回调函数的简单说明参考地址

    http://hi.baidu.com/software_one/item/f5b07aeda3ac61215a2d64cd

    ● init/1 - 服务器的初始化;
    
    ● handle_call/3 - 处理对服务器的同步调用。调用服务器的客户端被阻塞,直到本函数返回。
    
    ● handle_cast/2 - 处理对服务器的异步调用。调用的执行过程中,客户端不被阻塞。
    
    ● handle_info/2 - 是起着“收容”作用的函数。服务器收到的信息,如果不是同步调用或异步调用,就交由这个函数处理。例如,如果你的服务器与其他进程相连接,那么,要求退出进程的信息,就是这个函数处理。
    比如,别人拿到了gen_server的pid,给pid发消息,那么,消息会在这里被处理 ● terminate
    /2 - 关闭服务器时,调用这个函数,做些善后处理。 ● code_change/3 - 服务器运行中更新时,调用这个函数。在后面的文章中,会涉及这个函数的大量细节,但你应该至少会按照基本要求使用它。

    贴上一个例子

    -module(new_storage).
    -behaviour(gen_server).
    
    -export([start/0,stop/1,add/3,find/2]).
    
    -export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3]).
    
    start()->
        gen_server:start_link({local,?MODULE},?MODULE,[],[]).
    
    stop(Name)->
        gen_server:cast(Name, stop).
    
    add(Name,Key,Value)->
        gen_server:call(Name,{add,Key,Value}).
    
    find(Name,Key)->
        gen_server:call(Name,{find,Key}).
    
    %% callbacks of gen_server
    init([])->
        {ok,dict:new()}.
    
    handle_call({add,Key,Value},_From,Dict)->
        Reply = dict:store(Key,Value,Dict),
        {reply,ok,Reply};
    handle_call({find,Key},_From,Dict)->
        Reply = dict:find(Key,Dict),
        {reply,Reply,Dict}.
    
    handle_cast(stop, State) ->
        {stop, normal, State};
    handle_cast(_Msg,State)->
        {noreply,State}.
    
    handle_info(_Info,State)->
        {noreply,State}.
    
    terminate(_Reason,_State)->
        io:format("terminate trapped~n"),
        ok.
    
    code_change(_OldVsb,State,_Extra)->
        {ok,State}.

    示例:

    33>{ok,Pid}=new_storage:start().
    {ok,<0.97.0>}
    34> new_storage:add(Pid,testKey,testValue).
    ok
    35> new_storage:find(Pid,testKey).         
    {ok,testValue}
    36> new_storage:stop(Pid).                 
    terminate trapped
    ok
    37>
  • 相关阅读:
    【IDDFS】Power Calculus
    【A*/K短路】 [USACO08MAR]Cow Jogging G
    P1880 [NOI1995]石子合并
    【区间DP】[USACO16OPEN]248 G
    【树上背包】P1273 有线电视网
    【分组背包】[BJOI2019]排兵布阵
    DP学习笔记——背包专题
    【思维/构造】D
    【线段树+扫描线】P5490 【模板】扫描线
    【最小生成树】畅通工程再续 HDU
  • 原文地址:https://www.cnblogs.com/ziyouchutuwenwu/p/4065768.html
Copyright © 2020-2023  润新知