Erlang監督者および監督者の子供
-
27-10-2019 - |
質問
監督者について質問があります。たとえば、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
対応する子プロセスを開始します。
したがって、監督者は常に最初に開始され、次にその子プロセスは自動的にまたは手動で開始されます 戦略を再開します.
他のヒント
はい、最初に監督者を始めるべきです。なぜなら、監督者は子供を始める人であるため、子供を始めることはないからです。それが役に立てば幸い。