twn39 / code

:memo: 代码笔记,通过 issue 的方式记录日常遇到的问题和学习笔记
13 stars 1 forks source link

Erlang gen_server #228

Open twn39 opened 5 years ago

twn39 commented 5 years ago
-module(tcp_server).

-behaviour(gen_server).

-export([start_link/0, init/1, handle_call/3, handle_cast/2]).

start_link() -> 
    gen_server:start_link(?MODULE, ok, []).

init(ok) ->
    io:format("tcp_server init...\n"),
    {ok, []}.

handle_call(Command, _From, State) ->
    case Command of 
        {add, List} ->
            {reply, List, [List | State]};
        {get} -> 
            {reply, State, State} 
    end.

handle_cast(get, State) -> 
    {noreply, State}.
twn39 commented 5 years ago

behaviour gen_server 相当于继承了gen_server接口,必须实现init,handle_call/3, handle_cast/2函数,handle_call是实现同步调用,handle_cast是实现异步调用,无需等待。

使用rebar3 shell调用:

{ok, Pid} = tcp_server:start_link().
tcp_server init...
{ok,<0.144.0>}
2> gen_server:call(Pid, {get}).
[]
3> gen_server:call(Pid, {add, [2,4,5]}).
[2,4,5]
4> gen_server:call(Pid, {add, [6,7,8]}).
[6,7,8]
5> gen_server:call(Pid, {get}).         
[[6,7,8],[2,4,5]]