2

スーパーバイザーはモニターと同じですか?モニターを使用するのは良いですか、それともスーパーバイザーを使用する方が良いでしょうか?

スーパーバイザーの代わりにモニターを使用するタイミングがわかりません。

4

2 に答える 2

7

推奨される読書: http://learnyousomeerlang.com/errors-and-processes#monitors

スーパーバイザーは非常に特別な関係です。擬人化すると、上司として、私は部下の福利に直接責任を負います。彼/彼女が失敗した場合、私は状況を修正するために何かをする必要があります.

リンクは、すべて同じシステムの一部であるスーパーバイザおよびその他の直接関連するプロセスによって使用されます。

モニターは、確かに未熟な私の目には、リンクに似ていますが、主に、プロセスが実行されているかどうかに関心があるが、直接関連していない外部プロセスに役立ちます。

例として DNS を使用すると、DNS サーバーからの応答を取得しようとして時間を無駄にする前に、DNS サーバーが実行されているかどうかを知ることができれば便利ですが、DNS サーバーがダウンした場合、それを再起動するのは私の仕事ではありません。別の DNS サーバーに切り替える必要があるだけです。

于 2012-10-27T23:56:45.787 に答える
1

スーパーバイザーはOTP 動作です。これをプロセスの階層で使用します。階層の最上位には、各子に定義した再起動戦略を適用する責任を負うスーパーバイザーがあります。

子供は別の監督者または労働者になります。

ワーカーは、ジョブを実行するモジュールです。OTP アーキテクチャでは、通常は gen_server、gen_event、gen_fsm です... それらは正常に終了するか (この場合は何も行われません)、クラッシュする可能性があります。その後、スーパーバイザーは再起動戦略を適用します。

  • one_for_one : プロセスを再起動します
  • one_for_all : すべての子を終了し、すべて再起動します
  • rest_for_one : 開始リスト内の次の子を終了し、正しい順序で再起動します

これを実現するために、スーパーバイザは link または spawn_link 関数によって作成された双方向接続を使用します。2 つのプロセスがリンクされています。つまり、それらのいずれかがクラッシュすると、他のものもクラッシュします。設定されていない限りprocess_flag(trap_exit, true)、この場合はメッセージを受け取ります{'EXIT',FromPid,Reason}

これは、3 つのスーパーバイザーを持つ階層の例です (私の場合、Task_Sup は simple_one_for_one 戦略を使用し、子は Mngr_Server から Create(Task) を使用して作成され、同じ Mngr_server が各子を監視します):

ここに画像の説明を入力

Monitorは、呼び出しによって作成された 2 つのプロセス間の単方向接続です。

Ref = erlang:monitor(process, Pid2)プロセス Pid1 で。Pid2 が終了すると、Pid1 はメッセージを受け取ります。

{'DOWN', Ref, process, Pid2, Reason}

Pid1 は、Pid2 の終了を通知するために着信メッセージをチェックする必要があります。

于 2012-10-29T12:38:41.497 に答える