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

1

这完全是意料之中的,这是意料之中的,因为您正在滥用监督树功能。有一个隐藏的监督者叫做“应用监督者”。您的 application:start 函数应该返回一个由应用程序主管监控的 SINGLE pid。如果该进程崩溃,BEAM VM 也会崩溃(实际上取决于应用程序的启动方式;与工作进程类似,您的应用程序可以是永久的或暂时的(甚至可能是临时的))。

您应该有一名顶级主管(您的应用程序主管)。如果您需要两个顶级主管,他们都应该是您的应用程序主管的孩子。

于 2014-04-18T19:00:50.007 回答