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....
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....