如何使用Erlang OTP管理程序行为重启具有自定义状态的子项?

Mar*_*ark 9 erlang erlang-otp

我正在使用OTP管理程序行为来监督和重新启动子进程.然而,当孩子死亡时,我想以崩溃前的状态重新启动它.

如果我自己编写自定义主管,我可以收到{EXIT,Pid,Reason}消息并对其进行操作.当使用OTP管理程序行为时,它全部由OTP管理,我无法控制它.我实现的唯一回调函数是init.

在这种情况下是否有任何标准方法?如何自定义otp主管动态重启的子状态?如何使用OTP获取终止进程的Pid?或者也许可以在终止之前获得孩子的状态,然后将孩子恢复到崩溃之前的状态?

Jr0*_*Jr0 0

在不知道你正在做什么的任何细节的情况下,我可以想象一个以下的世界:

  1. 主管创建一个 ETS 表并将表标识符传递给每个孩子
  2. 子进程启动,并根据子进程的某些相关属性查询 ETS 表以查找要加载的状态
  3. 每次孩子的状态发生变化时,它都会将其写入 ETS 表

因此,如果我有 12 个子进程,代表 12 个 Cobol 部落,每个进程都会使用其名称作为 ETS 表的键,以查找前一个化身在启动时留下的状态。每当其状态发生变化时,每个进程都会更新表(再次使用其名称作为键)。

主管将自动重新启动被杀死的子进程,并且上面的步骤 2 将在子进程的 init 方法中执行。第3步将在子进程的handle_call、handle_cast和handle_info方法中处理(我正在对进程的性质做出一些假设)。主管可以提供多种重启策略,如果需要,甚至可以重启同级进程。

希望这能给你一些想法。