Я читаю Маленькое руководство по эликсиру и OTP, чтобы изучить эликсир, в книге есть глава, в которой автор строит супервизор с нуля. Есть часть, где автор реализует функцию для завершения процесса 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