start_child
スーパーバイザーが 1 人いて、このスーパーバイザーに対していくつか実行する必要があるとします。最初にすべてのスーパーバイザーを起動する必要がありますか? supervisor:start_child(my_sup,[])
または、my_sup を開始せずにのみできますか?
2 に答える
supervisor:start_link/2
まず、またはを呼び出すスーパーバイザー ツリーの一部としてスーパーバイザー プロセスを作成しますsupervisor:start_link/3
。作成されたスーパーバイザー プロセスはModule:init/1
、再起動戦略、最大再起動頻度、および子の仕様について調べるために呼び出します。
これは、gen_serverを開始するスーパーバイザーのサンプル コードです(ただし、他の gen_* モジュールを開始することもできます)。
-module(ch_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() ->
supervisor:start_link(ch_sup, []).
init(_Args) ->
{ok, {{one_for_one, 1, 60},
[{ch3, {ch3, start_link, []},
permanent, brutal_kill, worker, [ch3]}]}}.
タプル{ch3, ...}
は子仕様であり、次のように定義されています。
{Id, StartFunc, Restart, Shutdown, Type, Modules}
ch3
上記の例でサーバーを起動するための子仕様は次のようになります。
{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}
この例から、モジュールch3
がスーパーバイザーによって開始、監視、および停止されることがわかります。また、一般的に使用されるone_for_one
再起動戦略が指定されていることもわかります。 one_for_one
子仕様では、1 つの子プロセスが終了して再起動する必要がある場合、その子プロセスのみが影響を受けることを意味します。これはおそらくあなたの場合です。子プロセスは、スーパーバイザーによって自動的に開始、監視、再起動、および停止されます。
start_child/2
SupRef
対応する子プロセスを開始するスーパーバイザーに子仕様を動的に追加するために使用されます。
したがって、スーパーバイザーは常に最初に開始され、その後、再起動戦略に基づいてその子プロセスが自動または手動で開始されます。
はい、最初にスーパーバイザーを起動する必要があります。これは、子を起動するのはスーパーバイザーであるため、子を起動しないためです。それが役に立てば幸い。