NB Вообще говоря, если вы обнаружите, что смотрите на id
, вы делаете что-то не так. Но это все еще возможно.
Используйте Supervisor.which_children/1
изнутри вашей child
реализации:
defmodule Stack do
use GenServer
def lookup_self_id(sup) do
self_pid = self()
sup
|> Supervisor.which_children()
|> Enum.find(fn
{id, ^self_pid, _, _} -> id # pinned self → it’s me!
_ -> nil # skip everything else
end)
end
end
Предполагая, что ребенок знает супервизора pid
или супервизора с именем , вы передаете в эту функцию либо pid
, либо name
, повторяете его дочерние элементы и обнаруживаете себя по pid
.