Erlangダイナミックスーパーバイザーがgen_serverを開始します
-
27-10-2019 - |
質問
他のスーパーバイザーを作成するルートスーパーバイザーがあります: ジェネラコディセタグプレ
そして私はgen_server-リスナーを持っています。スーパーバイザーが作成されたときに、このgen_serverをpopd_listener_sup
スーパーバイザーで実行するにはどうすればよいですか?
ありがとうございます。
解決
ルートスーパーバイザー ジェネラコディセタグプレ
子プロセスが別のスーパーバイザーである場合、子仕様のShutdown
をinfinity
に設定して、サブツリーをシャットダウンするのに十分な時間を与える必要があります。Type
をsupervisor
に設定する必要があります。これが、私たちが行ったことです。
子スーパーバイザー ジェネラコディセタグプレ
ここで、子仕様では、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_link
のsupervisor:start
ではなくstart_link/0
を呼び出す)、exit(normal)
によってルートスーパーバイザーがシャットダウンされましたが、その子プロセスにはクリーンアップする時間がありました。