Supervisors用于重启失败的进程。临时进程是永远不应重新启动的进程。那么,为什么要为主管打扰这种类型的孩子呢?是否主要是因为它们可以作为one_for_all策略的一部分终止,或者当应用程序终止时?
答案 0 :(得分:10)
视图中存在一些问题,即仅存在重新启动作业的主管。以下是其中一些:
最终,所有流程都是暂时的。要在Erlang系统中对此进行建模,您必须使主管可以生成并让某些作业过期。这就是为什么你可以向主管添加工作,拥有各种类型的主管,以及“我如何找到进程X”的常见答案是“询问其主管”(尽管manager pattern也很常见,并涉及更多的主管)。
你当然可以在你的代码中间生成一些随机的一次性过程来完成一些一次性任务(有时这是正确的事情),但现在你必须编写崩溃处理代码在你的过程中,以防万一失败(如果你关心工作,那就是 - 如果你不关心,你为什么要这样做?)。如果您经常这样做,您将最终编写一个非正式指定的,错误的实现许多功能,这些功能已经成为OTP以主管形式提供的一部分 - 这是Greenspun's Tenth Rule的Erlang版本
(第十条规则的事情一直在发生,因为虽然语言 Erlang非常小,很简单而且不是hackerdom中许多误解的主题; OTP和运行时环境是巨大的,复杂的, Erlang / OTP的一部分是一个令人讨厌的局外人误解的主题。)
大多数时候为执行某些一次性工作而编写的模块都是用start/0,N
(或do
或其他)类型的函数编写的,它实际上调用了一个命名的supervisor,添加了一个临时的工人到它的名单,即使它是暂时的,也要在监督下进行调整。在每种情况下这都不是正确的做法,但这是很常见的事情 - 我倾向于默认这样的事情,直到我有理由不这样做。
以另一种方式来思考......在现实世界中,这个术语“主管”意味着监督工作,任务或工人。它不像“经理人”那么广泛,但它的范围远远超过“只要一个工人退出就雇用新员工” - 这对于人力资源部门来说甚至太狭隘了。
答案 1 :(得分:5)
主管的角色不仅是启动/重启进程,还要杀死它们。
必须照顾杀戮过程,因为在长期的生活应用中,存在积累“孤儿”的风险。变得无用的过程。因此,根据经验,每个过程都应与其他过程相关联,除非保证在有限的时间内自行消亡。
这可以在模块本身中完成,例如,当一个进程A生成一个进程B,并且它们应该总是在相同的条件下死掉时,它是有意义的(不要忘记一个进程死于该进程)原因'正常'不会将其死亡传播到关联过程)。但这有两个主要的不便之处:
使用主管(实际上是监督树)可以将流程管理与应用程序代码分开。它提供了一个全面,集中和标准化的视图,集成在OTP环境中。
存在临时过程(在某些情况下,它们占多数);他们的生命周期必须得到管理;这是主管的工作。