【问题标题】:How to model a supervisor tree in Elixir如何在 Elixir 中建模主管树
【发布时间】:2021-05-03 07:17:18
【问题描述】:

假设我有一个 Zone 动态主管(zone 是一个 genserver),每个 Zone 都有自己的 Player 动态主管(player 是一个 genserver)。

所以每个区域都有很多玩家,而我有很多区域。

这样做的方法是否只是将 Player supervisor 的 PID 存储在 Zone GenServer 中?

这是正确的方法吗?然后当我启动一个区域时也启动一个玩家主管?

这纯粹是概念性的,我是做这种事情的新手。我也将不胜感激任何有关这方面的学习资源!

【问题讨论】:

    标签: erlang elixir gen-server erlang-supervisor


    【解决方案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 更改,注册名称不会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 2016-04-20
      • 2017-02-21
      • 1970-01-01
      • 2017-11-23
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多