主管是OTP行为。
init([]) ->
RoomSpec = {mod_zytm_room, {mod_zytm_room, start_link, []},
transient, brutal_kill, worker, [mod_zytm_room]},
{ok, {{simple_one_for_one, 10, 10000}, [RoomSpec]}}.
以上代码将调用子级的terminate
方法。
但是如果我将brutal_kill
更改为整数超时(例如6000),则永远不会调用terminate
方法。
我在Erlang文档中看到一个解释:
一对一的动态创建子进程 无论关闭策略如何,都不会明确杀死主管, 但应在主管这样做时终止(即 收到来自父进程的退出信号)。
但是我无法完全理解。是不是说exit(Pid, kill)
可以终止simple_one_for_one
子规范,而exit(Pid, shutdown)
不能?
===================================更新============= ========================>
mod_zytm_room_sup.erl
-module(mod_zytm_room_sup). -behaviour(supervisor). -export([start_link/0, init/1, open_room/1, close_room/1]). start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). init([]) -> RoomSpec = {mod_zytm_room, {mod_zytm_room, start_link, []}, transient, brutal_kill, worker, [mod_zytm_room]}, {ok, {{simple_one_for_one, 10, 10000}, [RoomSpec]}}. open_room(RoomId) -> supervisor:start_child(?MODULE, [RoomId]). close_room(RoomPid) -> supervisor:terminate_child(?MODULE, RoomPid).
mod_zytm_room.erl
-module(mod_zytm_room). -behaviour(gen_server). -export([start_link/1]). -export([init/1, handle_cast/2, handle_info/2, handle_call/3, code_change/3, terminate/2]). start_link(RoomId) -> gen_server:start_link(?MODULE, [RoomId], []). init([RoomId]) -> {ok, []}. terminate(_, _) -> error_logger:info_msg("~p terminated:~p", [?MODULE, self()]), ok. ...other methods ommited.
mod_zytm_sup.erl
-module(mod_zytm_sup). -behaviour(gen_server). -export([start_link/0]). -export([init/1, handle_cast/2, handle_info/2, handle_call/3, code_change/3, terminate/2]). start_link() -> gen_server:start_link(?MODULE, [], []). init([]) -> {ok, []}. %% invoked by an erlang:send_after event. handle_info({'CLOSE_ROOM', RoomPid}, State) -> mod_zytm_room_sup:close_room(RoomPid), {noreply, State}. ...other methods ommited.
mod_zytm_sup
和mod_zytm_room_sup
都是系统监视树的一部分,mod_zytm_sup
调用mod_zytm_room_sup
创建或关闭mod_zytm_room进程。
主管是OTP行为。 init([])-> RoomSpec = {mod_zytm_room,{mod_zytm_room,start_link,[]},瞬态,野蛮杀人,工作者,[mod_zytm_room]},{确定,{{...
抱歉,我得到的结果有误。
一对一的动态创建子进程 无论关闭策略如何,都不会明确杀死主管, 但应在主管这样做时终止(即 收到来自父进程的退出信号)。