使用主管为每个节点启动 elixir 子进程

Posted

技术标签:

【中文标题】使用主管为每个节点启动 elixir 子进程【英文标题】:Starting elixir child processes for each node using supervisor 【发布时间】: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 启动子进程。我被困在这里了。

我该怎么做?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于使用主管为每个节点启动 elixir 子进程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Elixir 主管中引用之前启动的进程

Elixir - 基本主管设置崩溃而不是重新启动子进程

如何从受监督的工作进程中触发 Elixir 主管树终止

Elixir - 在监督下启动 Java JInterface OTP 节点

golang 热重启

如何在 Elixir 中建模主管树