Simple_one_for_one仅可在为brutal_kill指定关机策略后才能终止?

问题描述 投票:5回答:2

主管是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_supmod_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]},{确定,{{...

erlang otp
2个回答
4
投票

抱歉,我得到的结果有误。


0
投票

一对一的动态创建子进程 无论关闭策略如何,都不会明确杀死主管, 但应在主管这样做时终止(即 收到来自父进程的退出信号)。

© www.soinside.com 2019 - 2024. All rights reserved.