6

スーパーバイザは 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 ドキュメントに説明があります。

1 対 1 の単純なスーパーバイザーの動的に作成された子プロセスは、シャットダウン戦略に関係なく明示的に強制終了されませんが、スーパーバイザーが強制終了したとき (つまり、親プロセスからの終了シグナルが受信されたとき) に終了することが期待されます。

しかし、私は完全には理解できません。できないのに子仕様をexit(Pid, kill)終了できると言われていますか?simple_one_for_oneexit(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_room プロセスを作成または閉じるためにmod_zytm_sup呼び出します。mod_zytm_room_sup

4

2 に答える 2