スーパーバイザは 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_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_room プロセスを作成または閉じるためにmod_zytm_sup
呼び出します。mod_zytm_room_sup