children = [
%{
id: worker_1,
start: {Stack, :start_link, [[:hello]]}
},
%{
id: worker_2,
start: {Stack, :start_link, [[:hello]]}
}
]
您如何在子进程中知道您是哪个子ID? (不将其作为参数发送)
答案 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
或名为的,则将pid
或name
传递给此函数,遍历它的孩子,并通过pid
进行自我检测。