gen_server讲解

gen_server behaviour
gen_server为最常用的一个behaviour,其定义了client/server模型的基本框架。
我们只需要定义一个“回调”(callback)module,实现必要的export fun。

1.genserver:start_link/4

启动gen_server调用start_link/4,比如:gen_server:start_link({local, myserver}, myserver, arg, [])表示我们在本地节点注册一个名叫myserver的process,这个参数也可以忽略,那样就不会为process注册名称,而一切交互采用Pid进行。
第一个参数也可以为{global,myserver},表示通过调用global:register_name/2来进行名字的注册。
第二个参数myserver为回调模块名称(atom)
第三个参数为传递给myserver:init的参数,此处为空(Term)
第四个参数为gen_server的相关选项
函数成功则返回{ok, Pid}.

start_link/4会调用myserver:init/1进行初始化工作,这里的调用是同步进行的,只有init/1执行完毕后,start_link/4才可执行完毕。
注意如果此behaviour用在监督树中,则必须使用gen_server:start_link/4启动,如果某个单独的应用可以采用 gen_server:start启动。监督树中为什么使用gen_server/start_link/4其实好好想想就有答案了,因为监督树的目的就是为了维护控制worker,出错时进行必要的restart,因此只有将其link起来才能进行这些操作,否则互不相干啊。呵呵

2. myserver:init(Arg) -> {ok, State} | {stop, Reasion}

进行初始化,如果成功返回新的状态,否则gen_server停止

3. gen_server:call(Name, Term) -> Term

进行同步调用,即请求-等待结果。call内部调用myserver:handle_call/3函数。

4. gen_server:cast(Name, Term) -> void

进行异步调用,类似消息,调用后立即返回。cast内部调用myserver:handle_cast/2函数

5. gen_server的停止

如果gen_server是监督树(supervision tree)的一部分stop函数是没有必要的。gen_server会自动的被监督树停止。这里与监督树的停止策略(shutdown strategy)相关。如果停止策略为指定时间内停止,gen_server便可以在停止前做一些清理工作,首先在myserver:init/1中设置trap_exit为true(process_flag(trap_exit, true)),然后设置对应的terminate/2函数:terminate(shutdown, State)再此函数内就可以进行清理工作(因为监督树会首先向gen_server发送exit(Pid, shutdown)消息,然后等待某个超时,如果超时内Pid未停止则调用exit(Pid, kill)进行野蛮(brutal)的kill,此处参考supervision tree的shutdown strategy)。

continue....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值