【问题标题】:Is it a good practice to kill all linked child processes when killing a supervisor process in Elixir?在 Elixir 中杀死主管进程时杀死所有链接的子进程是一种好习惯吗?
【发布时间】:2020-03-15 01:49:10
【问题描述】:

我正在阅读 Little Elixir 和 OTP Guidebook 来学习 Elixir,书中有一章作者从零开始构建了一个 Supervisor。有一部分作者实现了一个函数来终止 Supervisor 进程,该进程反过来也会在终止自身之前终止与其链接的所有子进程。

据我了解,如果您有链接到特定进程的进程,并且如果其中一个被杀死,那么它们都被杀死,对吗?那么为什么我们需要在杀死主管之前杀死所有的子进程,这只是一个最佳实践吗?

这本书是这么说的

在您终止之前 主管进程,你需要终止它所链接的所有子进程,这由 terminate_children/1 私有函数处理,

defmodule ThySupervisor do
use GenServer
######################
# Callback Functions #
######################
def terminate(_reason, state) do
terminate_children(state)
:ok
end
#####################
# Private Functions #
#####################
defp terminate_children([]) do
:ok
end
defp terminate_children(child_specs) do
child_specs |> Enum.each(fn {pid, _} -> terminate_child(pid) end)
end
defp terminate_child(pid) do
Process.exit(pid, :kill)
:ok
end
end

【问题讨论】:

    标签: elixir


    【解决方案1】:

    如果您有链接到特定进程的进程并且如果其中一个被杀死,那么它们都被杀死

    TL;DR:没有魔法,OTP 做到了,但如果您决定重新实现 OTP,那么您就可以重新实现它 :)


    不存在真空中的链接过程。 Erlang VM 负责来回传递消息,也就是说。其他一切都由客户端代码完成。例如。使用Process.monitor/1(简单地委托给:erlang.monitor/1),可能会问VM“请告诉我这个进程什么时候会终止。”

    但在底层,所有这些链接都是由 Elixir(在绝大多数情况下委托给 Erlang/OTP)建立的。监督树是容错范式的核心,这就是编写所有代码的原因几十年前的一次,现在我们可能会使用更高层次的抽象,用“流程是相互关联的”这样的术语来思考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      相关资源
      最近更新 更多