0

2 つのトップレベル スーパーバイザを起動するアプリケーションが異常な状況である可能性があります。

...
-behavior(application).
...
start(_StartType, _StartArgs) ->
    sup1:start_link(),
    sup2:start_link().

どちらも{one_for_one, 0, 1}再起動戦略を持っています。それらの子crashは、bad_match エラーをスローする単純な関数を実装します。

私の質問には、sup1_child1:crash()スーパーバイザーを呼び出すsup1と終了しますが、アプリケーションは実行され続けます (つまり、スーパーバイザーsup2とその子は引き続き使用できます)。代わりに呼び出すとsup2_child1:crash()、アプリケーション全体が終了します。この後者の動作は、どちらの場合も私が期待するものです。呼び出しの順序を反転するstart_link()と、つまり、

...
    sup2:start_link(),
    sup1:start_link().

sup1 をクラッシュするとアプリケーションは終了しますが、sup2 をクラッシュしても終了しません。したがって、start_link() が呼び出される順序によって、どのスーパーバイザー クラッシュによってアプリケーションが終了するかが決まるようです。これは期待されていますか?それとも、ルート スーパーバイザを 2 つ持つことで、スーパーバイザ ツリー機能を悪用していますか?

ありがとう、

リッチ

4

1 に答える 1