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

时间:2017-06-20 22:10:04

标签: erlang elixir otp supervisor

我正在启动监督两个孩子的主管。第二个孩子需要对第一个孩子的引用。这样的接缝应该是可能的,因为通过使用one_for_rest策略,我可以确保如果第一次死亡,第二次重新启动。

children = [
  supervisor(SupervisorA, [arg1]),
  supervisor(SupervisorB, [arg2, ref_to_supervisor_a_process]),
]

supervise(children, strategy: :one_for_rest)

理想情况下,无需全局命名任何一个流程。

3 个答案:

答案 0 :(得分:1)

SupervisorA可以向name:提供Supervisor.start_link/3选项。

然后,

SupervisorB可以使用Process.whereis/1将名称解析为pid,或者只是将消息发送到指定的进程。

https://hexdocs.pm/elixir/Supervisor.html#start_link/3 https://hexdocs.pm/elixir/Process.html#whereis/1

答案 1 :(得分:0)

Supervisor.Spec.supervisor/3返回spec

有人可能会通过:

{id, _, _, _, _, _} = sup_a = supervisor(SupervisorA, [arg1])
children = [
  sup_a,
  supervisor(SupervisorB, [arg2, id]),
]

答案 2 :(得分:0)

我建议使用Director代替主管模块 它在重新启动,删除等方面更灵活,更强大。