私は単純なスーパーバイザーを実装しようとしていますが、失敗した場合は子プロセスを再起動するだけです。しかし、スーパーバイザーの下で複数のプロセスを生成する方法さえ知りません! このサイトで簡単なスーパーバイザー コードを調べたところ、何かが見つかりました
-module(echo_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() ->
{ok, Pid} = supervisor:start_link(echo_sup, []),
unlink(Pid).
init(_Args) ->
{ok, {{one_for_one, 5, 60},
[{echo_server, {echo_server, start_link, []},
permanent, brutal_kill, worker, [echo_server]},
{echo_server2, {echo_server2, start_link, []},
permanent, brutal_kill, worker, [echo_server2]}]}}.
init() 関数に「echo_server2」の部分を配置すると、このスーパーバイザーの下で別のプロセスが生成されると想定しましたが、例外 exit:shutdown メッセージが表示されます。
ファイル「echo_server」と「echo_server2」は同じコードですが、名前が異なります。だから私は今混乱しています。
-module(echo_server2).
-behaviour(gen_server).
-export([start_link/0]).
-export([echo/1, crash/0]).
-export([init/1, handle_call/3, handle_cast/2]).
start_link() ->
{ok,Pid} = gen_server:start_link({local, echo_server2}, echo_server2, [], []),
unlink(Pid).
%% public api
echo(Text) ->
gen_server:call(echo_server2, {echo, Text}).
crash() ->
gen_server:call(echo_server2, crash).
%% behaviours
init(_Args) ->
{ok, none}.
handle_call(crash, _From, State) ->
X=1,
{reply, X=2, State};
handle_call({echo, Text}, _From, State) ->
{reply, Text, State}.
handle_cast(_, State) ->
{noreply, State}.