在Elixir中终止主管进程时终止所有链接的子进程是否是一种良好的做法?

在Elixir中终止主管进程时终止所有链接的子进程是否是一种良好的做法?,elixir,Elixir,我正在读《小长生不老药和OTP指南》来学习长生不老药,书中有一章作者从头开始建立了一个导师。有一部分,作者实现了一个函数来终止主管进程,而主管进程又在终止自身之前终止所有链接到它的子进程 据我所知,如果您有链接到特定进程的进程,并且如果其中一个进程被终止,那么所有进程都将被终止,对吗?那么,为什么我们需要在杀死主管之前杀死所有的子进程,这只是一种最佳实践吗 顺便说一句,这本书是这么说的 在您终止 主管进程,您需要终止它链接到的所有子进程,这由terminate_children/1私有函数处理

我正在读《小长生不老药和OTP指南》来学习长生不老药,书中有一章作者从头开始建立了一个导师。有一部分,作者实现了一个函数来终止主管进程,而主管进程又在终止自身之前终止所有链接到它的子进程

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

顺便说一句,这本书是这么说的

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

如果您有链接到特定进程的进程,并且其中一个进程被终止,那么所有进程都将被终止

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


真空中不存在连接过程。ErlangVM负责来回传递消息,也就是说。其他一切都由客户机代码完成。例如。对于(哪些是简单的委托)有人可能会问VM“请告诉我这个过程什么时候结束。”

但是在后台,所有这些链接都是由Elixir建立的(在绝大多数情况下,Elixir代表Erlang/OTP)。监督树是容错范式的核心,这就是为什么所有代码都在几十年前编写过一次,而现在我们可以使用更高级别的抽象,用“流程是链接的”这样的术语来思考

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