【问题标题】:Why is Process ID returning as undefined?为什么进程 ID 返回未定义?
【发布时间】:2019-11-08 00:09:14
【问题描述】:

我有 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]}
]

数字、原子或模块无关紧要。标识符总是返回 undefined。

是Elixir的bug吗?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    我找到了解决办法

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

    id - it is always :undefined for dynamic supervisors
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2021-12-11
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多