erlang - 为 Erlang 主管生临时 child 有什么意义?

标签 erlang erlang-otp

Supervisors是否可以重新启动失败的进程。临时进程是永远不应该重新启动的进程。那么,为什么要让这种类型的 child 成为主管呢?主要是因为它们可以作为 one_for_all 策略的一部分终止,还是在应用程序终止时终止?

最佳答案

主管只是为了重新启 Action 业而存在的观点存在几个问题。这里有几个:

  • “临时”的含义是模糊的。
  • 重新启动因未知(可能是资源受限或其他外部)原因而在某处失败的作业和让完成其作业的进程过期是两件不同的事情。
  • Supervisors 提供一致的接口(interface)或入口,不仅用于重新启动,还用于启动、日志记录、跟踪、崩溃清理、更高级别的状态服务(如“不太可接受的失败”)以及构建的各种其他 OTP 便利进入 SASL 等工具。

  • 最终,所有过程都是暂时的。要在 Erlang 系统中对此进行建模,您必须让主管生成并让某些作业过期。这就是为什么您可以向主管添加工作,拥有各种类型的主管,并且“我如何找到进程 X”的常见答案是“询问其主管”(尽管 manager pattern 也很常见,并且涉及更多监督员)。

    你当然可以在你的代码中间产生一些随机的一次性进程来完成一些一次性任务(有时这是正确的做法),但现在你必须在你的进程中编写崩溃处理代码以防万一失败(如果你关心这份工作,那就是——如果你不关心,你为什么要这样做?)。如果你经常这样做,你最终会编写一个非正式指定的、有缺陷的许多功能的实现,这些功能已经是 OTP 以监督者形式提供的一部分——这是 Greenspun's Tenth Rule 的 Erlang 版本.

    (第十条规则的事情一直在发生,因为虽然 Erlang 语言非常小、简单,并且在整个黑客领域中没有很多误解;OTP 和运行时环境是巨大的、复杂的,并且 Erlang/OTP 的一部分是主题千千万万的局外人误解。)

    大多数时候,为执行某些一次性工作而编写的模块都是用 start/0,N 编写的。 (或 do 或其他)类型的函数,它实际上调用了一个命名的主管,将一个临时工作人员添加到它的列表中,并让它在监督下旋转,即使它是临时的。这不是在每种情况下都做正确的事情,但这是很常见的事情——我倾向于默认使用这样的事情,直到我有理由不这样做。

    换个角度想……在现实世界中,“主管”这个词的意思是监督工作、任务或 worker 。它不像“经理”那么宽泛,但它比“一个 worker 辞职就雇用新 worker ”要广泛得多——这对于人力资源部门来说甚至过于狭隘了。

    关于erlang - 为 Erlang 主管生临时 child 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29326161/

    相关文章:

    Erlang - 交错的简单方法

    erlang - 监督树启动失败

    elixir - 在 GenServer.start_link/3 中使用 { :via, module, term} 注册名称有什么好处?

    erlang - fun2ms应该改造吗?

    erlang - centos无法安装erlang

    erlang - 无法在函数防护中使用函数调用

    erlang - 如何找到 OTP 流程的主管?

    erlang - 用 fun() 中的新行回显

    erlang - 为什么我的主管在初始化时失败并带有 badarg?

    Erlang容错应用程序: PA or CA of CAP?