启用服务器
gen_server:start_link(Name, Mod, InitArgs, Opts)这个调用是所有事物的起点。它 会创建一个名为Name的通用服务器,回调模块是Mod,Opts则控制通用服务器的行为。在这里可 以指定消息记录、函数调试和其他行为。通用服务器通过调用Mod:init(InitArgs)启动。
init([]) ->
{ok, #state{}}
如果返回{ok, State},就说明我们成功启动了服务器,它的初始状态是State。
调用服务器
要调用服务器,客户端程序需要执行gen_server:call(Name, Request)。它最终调用的是回调模块里的handle_call/3。
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}
Request(gen_server:call/2的第二个参数)作为handle_call/3的第一个参数重新出现。 From是发送请求的客户端进程的PID,State则是客户端的当前状态。 我们通常会返回{reply, Reply, NewState}。在这种情况下,Reply会返回客户端,成为 gen_server:call的返回值。NewState则是服务器接下来的状态。 其他的返回值({noreply, ..}和{stop, ..})相对不太常用。no reply会让服务器继续 工作,但客户端会等待一个回复,所以服务器必须把回复的任务委派给其他进程。用适当的参数调用stop会停止服务器。
调用和播发
我们已经见过了gen_server:call和handle_call之间的交互,它的作用是实现远程过程 调用。gen_server:cast(Name, Msg)则实现了一个播发(cast),也就是没有返回值的调用(实 际上就是一个消息,但习惯上称它为播发来与远程过程调用相区分)。 对应的回调方法是handle_cast,它的模板项如下:
handle_cost(_Msg, State) ->
{noreply, State}.