为Erlang主管提供临时子女有什么意义?

主管在那里重新启动失败的进程。 临时进程是不应该重新启动的进程。 那么,为什么还要让这种类型的孩子担任主管? 这主要是因为它们可以作为one_for_all策略的一部分终止,或者当应用程序终止时?


主管只存在重新启动作业的观点存在几个问题。 这里有几个:

  • “临时”的含义是模糊的。
  • 重新启动一个未完成的工作(可能是资源限制或其他外部原因),并让一个进程到期并完成其工作是两件不同的事情。
  • Supervisors提供了一个一致的界面或门口,不仅可以重新启动,而且还可以启动,记录,跟踪,清理故障,为更高级别的状态服务(如“不太可接受的失败”级别)以及构建的各种其他OTP便利进入SASL等工具。
  • 最终,所有的过程都是暂时的。 要在Erlang系统中对此进行建模,您必须确保主管产生并让某些工作到期。 这就是为什么你可以将工作添加到主管,拥有各种类型的主管,并且经常回答“如何找到流程X”是“询问其主管”。

    你当然可以在代码中间产生一些随机的一次性过程来完成一些一次性任务(有时候这是正确的),但是现在你必须在你的过程中写入崩溃处理代码以防万一失败(如果你关心工作,那就是 - 如果你不这样做,你为什么要这么做?)。 如果你经常这样做,你会结束编写一个非正式指定的错误地执行许多功能的功能,这些功能已经是OTP以监督员的形式提供的一部分 - 这是Greenspun的第十条规则的Erlang版本。

    (第十条规则的事情总是发生,因为虽然语言Erlang非常小,但很简单,而不是黑客中许多误解的主题; OTP和运行时环境非常庞大,复杂并且是Erlang / OTP的一部分,它们是一个局外人的误解。)

    大多数时间被写入执行一些一次性工作的模块都是用一个start/0,N (或do或其他)实际调用一个命名监督员的函数编写的,将一个临时工添加到它的列表中,即使它是暂时的,它也会在监督下转动。 这并不是每件事情都应该做的事,但这是一件很常见的事情 - 我倾向于默认类似这样的事情,直到我有理由不这样做。

    用另一种方式来思考......在现实世界中,这个术语“主管”意味着监督一项工作,任务或工作人员。 它不像“经理人”那么广泛,但是它比“每当一个工人离职时雇用新的工人”更广泛 - 这对于人力资源部门来说甚至太狭隘。


    监督员的角色不仅是启动/重启进程,还要杀死他们。

    必须照顾杀害程序,因为在漫长的生活应用程序中,积累“孤儿”程序的风险变得毫无用处。 所以,作为一个经验法则,每个过程都应该与其他一些过程联系起来,除非它确保在有限的时间内自行消亡。

    这可以在模块本身完成,例如,当一个进程A产生一个进程B并且它们应该总是在相同的条件下死亡时(不要忘记一个正常的'死亡'进程将会不会将其死亡传播给相关流程)。 但是这有两个主要的不便:

  • 由于情况通常要复杂得多,因此它会将一些(很多?)进程管理代码添加到您的模块中,并与其主要用途代码混合在一起,从而降低应用程序的可读性。
  • 它会给你一个非常局部(局部)的过程管理视图,同时它也是一个横向和架构问题。 这又会导致流程管理的可读性差。
  • 监督员的使用,实际上是一个监督树,允许您将流程管理与应用程序代码分开。 它提供了一个全面,集中和标准化的视图,并集成在OTP环境中。

    临时过程存在(有些情况下它们占多数); 他们的生命周期必须得到管理; 这是监督人员的工作。

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

    上一篇: What is the point of having temporary children for Erlang supervisors?

    下一篇: Erlang supervisor: how to check if all the workers have replied