- 停止
- 在监督树中
- 独立Gen_Server
停止
在监督树中
若genserver是某个监督树的一部分,则无需停止函数。它的督程会自动终止它。它的具体做法由督程中设置的 [关闭策略_]($cfa29cf763f4b135.md#shutdown) 定义。
如果在终止之前需要进行一些清理工作,那么关闭策略必须是一个超时值,同时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) 来优雅地终止。