Получить контролируемый идентификатор ребенка из процесса детей - PullRequest
0 голосов
/ 27 июня 2018
children = [
  %{
    id: worker_1,
    start: {Stack, :start_link, [[:hello]]}
  },  
  %{
    id: worker_2,
    start: {Stack, :start_link, [[:hello]]}
  }
]

Как вы можете узнать в детском процессе, какие вы дети? (без отправки в качестве параметра)

1 Ответ

0 голосов
/ 27 июня 2018

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.

...