Erlang主管终止行为

我有可能是一个不寻常的情况,一个启动2个顶级主管的应用程序,例如,

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

他们都有一个{one_for_one, 0, 1}重启策略。 他们的孩子实现了一个简单的crash函数,该函数抛出bad_match错误。

对于我的问题,如果我打电话给sup1_child1:crash() supervisor sup1将终止,但应用程序将继续运行(即主管sup2及其子sup2仍然可用)。 如果我调用sup2_child1:crash()则整个应用程序终止。 这后一种行为是我期望在这两种情况下。 如果我翻转start_link()调用的顺序,即,

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

然后崩溃sup1将导致应用程序终止,但崩溃sup2不会。 所以看起来start_link()被调用的顺序决定了哪个监控程序崩溃会导致应用程序终止。 这是预期的吗? 还是我滥用监督树功能?有2个root监督员?

谢谢,

丰富


这是完全可以预料的, 因为您滥用监督树功能,所以这是预料之中的。 有一位被称为“应用程序主管”的隐藏主管。 您的应用程序:启动函数应该返回应用程序主管要监视的单个pid。 如果该进程崩溃,则BEAM虚拟机也会崩溃(实际上取决于应用程序的启动方式;与工作进程类似,应用程序可能是永久的或暂时的(甚至可能是临时的))。

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

链接地址: http://www.djcxy.com/p/38211.html

上一篇: Erlang supervisor termination behavior

下一篇: How to check whether the process was restarted by supervisor?