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?