停止
停止
在监督树中
若gen _server是某个监督树的一部分,则无需停止函数。它的督程会自动终止它。它的具体做法由督程中设置的 _ 关闭策略_ 定义。
如果在终止之前需要进行一些清理工作,那么关闭策略必须是一个超时值,同时gen_server必须在 init 函数中设置为捕获退出信号。当gen_server被要求关闭时,它就会调用回调函数 terminate(shutdown,State) :
init(Args) ->
...,
process_flag(trap_exit, true),
...,
{ok, State}.
...
terminate(shutdown, State) ->
..code for cleaning up here..
ok.
独立Gen_Server
如果gen_server并非某个监督树的一部分,那么可以用一个停止函数,例如:
...
export([stop/0]).
...
stop() ->
gen_server:cast(ch3, stop).
...
handle_cast(stop, State) ->
{stop, normal, State};
handle_cast({free, Ch}, State) ->
....
...
terminate(normal, State) ->
ok.
回调函数处理 stop 请求并返回一个元组 {stop,normal,State1} ,其中 normal 表示这是一个正常的终止, State1 是gen_server状态的新值。这会引发gen_server调用 terminate(normal,State1) 来优雅地终止。
