質問

監督者について質問があります。たとえば、1人のスーパーバイザーがいて、このスーパーバイザーのstart_childを実行する必要があります。最初にスーパーバイザーを開始する必要がありますか?または私だけができます supervisor:start_child(my_sup,[]) MY_SUPが始まることなく?

ありがとうございました。

役に立ちましたか?

解決

最初に、監督ツリー呼び出しの一部として監督者プロセスを作成します 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, ...} aです 子の仕様, 、この方法で定義されています。

{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 対応する子プロセスを開始します。

したがって、監督者は常に最初に開始され、次にその子プロセスは自動的にまたは手動で開始されます 戦略を再開します.

他のヒント

はい、最初に監督者を始めるべきです。なぜなら、監督者は子供を始める人であるため、子供を始めることはないからです。それが役に立てば幸い。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top