質問

他のスーパーバイザーを作成するルートスーパーバイザーがあります: ジェネラコディセタグプレ

そして私はgen_server-リスナーを持っています。スーパーバイザーが作成されたときに、このgen_serverをpopd_listener_supスーパーバイザーで実行するにはどうすればよいですか?

ありがとうございます。

役に立ちましたか?

解決

ルートスーパーバイザー ジェネラコディセタグプレ

子プロセスが別のスーパーバイザーである場合、子仕様のShutdowninfinityに設定して、サブツリーをシャットダウンするのに十分な時間を与える必要があります。Typesupervisorに設定する必要があります。これが、私たちが行ったことです。

子スーパーバイザー ジェネラコディセタグプレ

ここで、子仕様では、Shutdownの値を2000に設定します。整数のタイムアウト値は、スーパーバイザーがexit(Child,shutdown)を呼び出して子プロセスを終了するように指示し、子プロセスからシャットダウンする理由で終了シグナルを待つことを意味します。

リスナー ジェネラコディセタグプレ

Erlang / OTPドキュメントから:

gen_serverがの一部である場合 監督ツリーとそのによって注文されます 終了するスーパーバイザー、機能 Module:terminate(Reason, State)は 次の場合、Reason=shutdownで呼び出されます 次の条件が適用されます。

  • gen_serverは、終了信号をトラップするように設定されています。
  • スーパーバイザーの子仕様で定義されているシャットダウン戦略
    は整数のタイムアウト値であり、
    ではありません。 brutal_kill。

    そのため、erlang:process_flag(trap_exit, true)Module:init(Args)と呼びました。

    サンプル実行

    ルートスーパーバイザーの開始: ジェネラコディセタグプレ

    ルートスーパーバイザーが実行され、その子プロセス(この場合は子スーパーバイザー)が自動的に開始されます。次に、子スーパーバイザーは子プロセスを開始します。この場合、ch1という子は1つだけです。

    ch1に通常のコードを評価させましょう: ジェネラコディセタグプレ

    悪いコード: ジェネラコディセタグプレ

    ご覧のとおり、子プロセスのch1は、子スーパーバイザーのpopd_listener_supによって再起動されました(ch1 has started (<0.39.0>)に注意してください)。

    シェルとルートスーパーバイザーは双方向にリンクされているため(ルートスーパーバイザー関数supervisor:start_linksupervisor:startではなくstart_link/0を呼び出す)、exit(normal)によってルートスーパーバイザーがシャットダウンされましたが、その子プロセスにはクリーンアップする時間がありました。

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