使用主管为每个节点启动 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 子进程的主要内容,如果未能解决你的问题,请参考以下文章