停止

停止

在监督树中

若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) 来优雅地终止。