我有Supervisor及其子Genserver,其代码如下:
defmodule MyApp.StatisticSupervisor do
use DynamicSupervisor
def start_link(_) do
DynamicSupervisor.start_link(__MODULE__, [], name: {:global, __MODULE__})
end
def start_statistic(team_id) do
DynamicSupervisor.start_child(global_name(), {MyApp.Statistic.Server, [team_id]})
end
def init(_) do
DynamicSupervisor.init(strategy: :one_for_one)
end
end
defmodule MyApp.Statistic.Server do
def child_spec(team_id) do
%{
id: team_id,
start: {__MODULE__, :start_link, [team_id]},
restart: :transient
}
end
def start_link(team_id) do
GenServer.start_link(__MODULE__, %{team: team_id}, name: via_tuple(team_id))
end
def init(state) do
{:ok, state}
end
defp via_tuple(team_id) do
{:via, :syn, {:team, team_id}}
end
end
代码正确。然后,我使用命令启动genserver:
MyApp.StatisticSupervisor.start_statistic(1)
>
{:ok, #PID<0.973.0>}
然后,我正在执行代码
DynamicSupervisor.which_children({:global, MyApp.StatisticSupervisor})
并且命令正在返回:
[
{:undefined, #PID<0.973.0>, :worker, [MyApp.Statistic.Server]}
]
我很困惑。为什么ID返回的是undefined而不是1?
我希望会被退回:
[
{1, #PID<0.973.0>, :worker, [MyApp.Statistic.Server]}
]
与数字,原子或模块无关。标识符始终返回未定义。
是Elixir的错误吗?
我找到了解决方案
http://erlang.org/doc/man/supervisor.html#which_children-1
id - it is always :undefined for dynamic supervisors