为什么进程ID返回未定义状态?

我有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,[MyApp.Statistic.Server]}
]

与数字,原子或模块无关。标识符始终返回未定义。

是Elixir的错误吗?

killshe123 回答:为什么进程ID返回未定义状态?

我找到了解决办法

http://erlang.org/doc/man/supervisor.html#which_children-1

id - it is always :undefined for dynamic supervisors
本文链接:https://www.f2er.com/3144364.html

大家都在问