OTP的行为模式对于初学者理解起来的确是有一定难度的,现根据个人理解总结如下:
1.基本工作方法
由用户定义相关功能函数,但这个功能函数并不是直接实现相关功能,而是直接调用gen_server模块中的指定功能所需要的对应函数。而用户调用gen_server模块中的对应函数会间接调用由用户定义的具体实现(要求这个具体实现必须按要求返回数据)。从而完成相关功能。读起来是不是很绕人啊。
举个例子:在通用服务行为模式中有个同步消息发送和等待应答的功能的实现方法,代码实现框架如下:
message_req() ->
gen_server:call(?SERVER,message).
handle_call(message,_From,State) ->
.......,
{reply,Data,Nstate[,Time]}
用户定义的函数message_req中,并没有实现请求数据的处理,而是通过调用gen_server中的call函数,发送一个简单的消息message。在gen_server:call/2中会以某种间接的方式调用handle_call/2来实现相关的处理,并收到其处理后的回应,最后会把handle_call/2中回应的Data放入一个形如{ok,Data}元组中作为message_req/0调用gen_server:call/2的返回结果。
注:其中这种调用模式是固定的,而handle_call/2返回值的模式也是固定的,gen_server:call/2返回值的模式也是固定的。
要运用gen_server行为模式就必须知道这个工作模式,即知道API接口函数gen_server:call/2和回调函数handle_call/2的对应关系。
调用与返回关系图如下:
2.基本API与回调接口
start_link() gen_server:start_link
功能 | 调用起点 | gen_server调用接口 | 回调接口 |
服务启动 | start_link() | gen_server:start_link/4 | init/1 |
同步消息 | 自定义名称(目标服务器,消息类型) | gen_server:call(目标服务器,消息类型) | handle_call(消息类型,_From,State) 返回模式:{reply,Data,Nstat[,Time]} |
异步消息 | 自定义名称(目标服务器,消息类型) | gen_server:cast(目标服务器,消息类型) | handle_cast(消息类型,State) 无返回 |
带外消息 | 无 | 无 | handle_info(消息类型,_From,Data) 返回模式:{reply,Data,Nstat[,Time]} |
退出服务 | terminate(_Reason, _State) | ||
代码更新 | code_change(_OldVsn, State, _Extra) |
本文参考:
1.Erlang OTP并发编程实战
2.http://blog.csdn.net/zhangzhizhen1988/article/details/7932449#0-qzone-1-71757-d020d2d2a4e8d1a374a433f596ad1440