【问题标题】:Starting elixir child processes for each node using supervisor使用主管为每个节点启动 elixir 子进程
【发布时间】:2020-02-21 08:35:36
【问题描述】:

我正在尝试输入节点数并为每个节点启动 genserver 进程;即每个GenServer.start_link(n)(其中n 是节点号)为每个进程启动一个单独的进程(PID)。

pids = Enum.map(1..totalnodes, fn n ->
  {:ok, unit} = GenSerModule.start_link(n)
  unit
end)

从该行返回 pid(#<12.2.2.1>#<12.2.2.2> 等)。

现在我想在主管下启动节点。也就是说,我必须通过 Supervisor 的每个节点的 init 函数启动 genserver 进程并获取 PID。像这样的东西:(我知道这是错误的)

pids = Enum.map(1..totalNodes, fn n ->
  {:ok, unit} = worker(GenServerModule, n)
  unit
end)
Supervisor.init(nodeMap,[strategy: :one_for_one])

我想在这个函数中获取已启动子进程的 PID,我通过 Supervisor 启动子进程。我被困在这里了。

我该怎么做?

【问题讨论】:

    标签: elixir erlang-otp erlang-supervisor


    【解决方案1】:

    Supervisor.Spec.worker/3,除了它已被弃用,不做任何动作,它returns a childspec tuple

    当需要动态启动工作人员,受监督时,他们通常使用DynamicSupervisor

    但是,如果节点是指远程节点,则不可能监督远程进程,因为(除了许多其他问题)它违反了容错(VM 无法确保另一个 VM 永远启动。)

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2017-11-23
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2018-10-24
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多