如何在 Elixir 中建模主管树
Posted
技术标签:
【中文标题】如何在 Elixir 中建模主管树【英文标题】:How to model a supervisor tree in Elixir 【发布时间】:2021-05-03 07:17:18 【问题描述】:假设我有一个 Zone 动态主管(zone 是一个 genserver),每个 Zone 都有自己的 Player 动态主管(player 是一个 genserver)。
所以每个区域都有很多玩家,而我有很多区域。
这样做的方法是否只是将 Player supervisor 的 PID 存储在 Zone GenServer 中?
这是正确的方法吗?然后当我启动一个区域时也启动一个玩家主管?
这纯粹是概念性的,我是做这种事情的新手。我也将不胜感激任何有关这方面的学习资源!
【问题讨论】:
【参考方案1】:只是将
PlayerSupervisor
的PID存储在ZoneGenServer
中?
如果PlayerSupervisor
因某种原因崩溃,这将不够健壮。一种方法是使相应的PlayerSupervisor
存在ZoneGenServer
陷阱,并在PlayerSupervisor
崩溃时崩溃,但这意味着您正在实施已经提供的部分OTP。我会选择以下内容(ZoneSupervisor
以 :rest_for_one
strategy 开头,所有其他人以 :one_for_one
开头):
————————————————————
| ZoneSupervisor |
————————————————————
⇓ ⇓
———————————————————— ——————————————————
| PlayerSupervisor | | ZoneGenServer |
———————————————————— ——————————————————
⇓
————————————————————
| PlayerGenServer |
————————————————————
现在,当我们可以安全地避免崩溃时,唯一的办法就是让ZoneGenServer
意识到PlayerSupervisor
。可以通过向ZoneSupervisor
询问其子代和/或通过name registration 和:via, module, term
来完成。使用PID
作为进程处理程序容易受到进程重启(由于崩溃等)的影响。PID
更改,注册名称不会。
【讨论】:
以上是关于如何在 Elixir 中建模主管树的主要内容,如果未能解决你的问题,请参考以下文章
在 Elixir ExUnit 中,我如何保证 Supervisor 将创建一个新的 GeNserver?