erlang 我们应该在哪里重新开始'simple_one_for_one'的子进程?

fd3cxomn  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(150)

我有一个Erlang应用程序,其中有一个simple_one_for_one监督器,它监督一组监视网页变化的进程(每个孩子一个URL)。
在将所讨论的管理者添加到应用的顶级管理者(沿着其他一些进程)之后,我启动了应用行为的start函数中应该处于活动状态的子进程。然后,随着条目的添加/删除(条目被持久化到DB中),子进程会动态地启动和停止。
如果这个simple_one_for_one管理程序因为太多的子程序崩溃(例如,由于网络问题)而崩溃,管理程序本身会重新启动,但是它的子程序会丢失。此时,我想检查DB并重新启动应该处于活动状态的子程序。
但是,我应该如何重新启动子进程?我如何知道Supervisor已经重新启动?我应该从Supervisor自己的start_link函数中调度启动子进程吗?有没有更好的设计方法?

cnh2zyt3

cnh2zyt31#

1.将simple_one_for_one管理程序的重启策略更改为

#{strategy => simple_one_for_one,
                 intensity => 0,
                 period => 1}

1.将子进程(监视网页中更改的进程)的terminate/2方法更改为

terminate(normal, _State) ->
  %% process terminated normally
  ok;
terminate(_Reason, _State) ->
  %% spawn the child again
  do_supverisor_start_child(),
  ok.

相关问题