Является ли хорошей практикой уничтожение всех связанных дочерних процессов при уничтожении процесса супервизора в Elixir? - PullRequest
1 голос
/ 14 марта 2020

Я читаю Маленькое руководство по эликсиру и 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

1 Ответ

2 голосов
/ 14 марта 2020

если у вас есть процессы, связанные с определенным процессом, и если один из них уничтожен, то все они уничтожаются

TL; DR: нет magi c, OTP делает это, но если вы решите повторно внедрить OTP, вы должны его повторно реализовать:)


Не существует такой вещи, как a связанный процесс в вакууме . Erlang VM заботится о передаче сообщений туда и обратно, то есть. Все остальное делается клиентским кодом. Например с Process.monitor/1 (который просто делегирует :erlang.monitor/1,) можно спросить у ВМ «пожалуйста, скажите мне, когда этот процесс будет d ie.»

Но под капотом все эти ссылки устанавливаются Elixir (который в подавляющем большинстве случаев делегирует Erlang / OTP.) Деревья надзора являются ядром отказоустойчивой парадигмы, поэтому весь код был написан раз в десятилетия go и теперь мы можем использовать более высокий уровень абстракции, думая в терминах «процессы связаны».

...