从子进程中获取受监管的子ID

时间:2018-06-27 09:44:17

标签: elixir

children = [
  %{
    id: worker_1,
    start: {Stack, :start_link, [[:hello]]}
  },  
  %{
    id: worker_2,
    start: {Stack, :start_link, [[:hello]]}
  }
]

您如何在子进程中知道您是哪个子ID? (不将其作为参数发送)

1 个答案:

答案 0 :(得分:2)

注意事项通常来说,如果您发现自己在id处抬头,那说明您做错了。但这仍然是可能的。

在您的child实现中使用Supervisor.which_children/1

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 名为,则将pidname传递给此函数,遍历它的孩子,并通过pid进行自我检测。