erlang]supervisor(监控树)的重启策略

1. init函数

init() ->
    {ok, {SupFlags, [ChildSpec,...]}} | ignore.

[ChildSpec,...] 是在init之后默认要启动的子进程。

2. SupFlags参数

{Type, Times, Sec}

  • Type: 重启策略
    • one_for_one: 一个子进程终止,只重启该进程,在init的时候会启动参数内的子进程
    • simple_one_for_one: 同one_for_one,但是在init的时候不会启动子进程,需要动态调用启动
    • one_for_all: 一个子进程终止,将重启所有子进程
    • rest_for_one: 一个子进程终止,将按顺序重启这个子进程和之后顺序的子进程
  • Times: 次数(监控频率)
  • Sec: 秒数(监控频率),如果在Sec秒内重启次数超过Times,则终止所有进程,并终止监控树,将由父进程决定它的命运

3. ChildSpec参数如下

{Id, StartFunc, Restart, Shutdown, Type, Modules}

%% 或者

#{
    id => child_id(),
    start => mfaargs(),
    restart => restart(),
    shutdown => shutdown(),
    type => work(),
    modules => modules()
}
  • Id 子进程ID标识符
  • StartFunc = {M, F, A}: 子程序启动入口
  • Restart: 重启方案
    • permanent: 如果app终止了,整个系统都会停止工作(application:stop/1除外)。
    • transient: 如果app以normal的原因终止,没有影响。任何其它终止原因都谁导致整个系统关闭。
    • temporary: app可以以任何原因终止。只产生报告,没有其它任何影响。
  • Shutdown: 终止策略
    • brutal_kill: 无条件终止
    • 超时值(毫秒): 终止时,如果超时,则强制终止
    • infinity: 如果子进程是监控树,设置为无限大,等待其终止为止
  • Type:
    • worker: 普通子进程
    • supervisor: 子进程是监控树
  • Modules:
    • dynamic: 当子进程是gen_event
    • [Module]: 当子进程是监控树、gen_server或者gen_fsm,表示回调模块名称

4. 监控树操作

Sup通常可以为?MODULE

% 启动监控树
supervisor:start_link(Sup, []).

% 启动一个子进程
supervisor:start_child(Sup, ChildSpec).

% 停止一个子进程
supervisor:terminate(Sup, Id).

% 删除一个子进程
supervisor:delete_child(Sup, Id).  ,如需转载请自行联系原作者
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Erlang 4叉的实现: 首先,定义一个模块,称为quadtree,该模块将包含以下函数: ``` -module(quadtree). -export([insert/2, search/2]). -record(point, {x, y}). -record(bbox, {x1, y1, x2, y2}). -record(node, {nw, ne, sw, se, bbox, points=[]}). % 插入一个点到4叉中 insert(P, nil) -> {node, nil, nil, nil, nil, P, P, []}; insert(P, {node, NW, NE, SW, SE, BBox, _, []}) -> {node, NW, NE, SW, SE, BBox, P, []}; insert(P, {node, NW, NE, SW, SE, BBox, P0, Points}) -> case subnode(P0, BBox) of nw -> {node, insert(P, NW), NE, SW, SE, BBox, P0, Points}; ne -> {node, NW, insert(P, NE), SW, SE, BBox, P0, Points}; sw -> {node, NW, NE, insert(P, SW), SE, BBox, P0, Points}; se -> {node, NW, NE, SW, insert(P, SE), BBox, P0, Points} end. % 搜索一个矩形内的所有点 search(BBox, nil) -> []; search(BBox, {node, NW, NE, SW, SE, NodeBBox, P, Points}) -> case intersect(BBox, NodeBBox) of true -> [P | Points] ++ search(BBox, NW) ++ search(BBox, NE) ++ search(BBox, SW) ++ search(BBox, SE); false -> [] end. % 确定一个点在哪个象限中 subnode(P, {X1, Y1, X2, Y2}) when P#point.x >= (X1 + X2) / 2, P#point.y >= (Y1 + Y2) / 2 -> se; subnode(P, {X1, Y1, X2, Y2}) when P#point.x >= (X1 + X2) / 2, P#point.y < (Y1 + Y2) / 2 -> ne; subnode(P, {X1, Y1, X2, Y2}) when P#point.x < (X1 + X2) / 2, P#point.y >= (Y1 + Y2) / 2 -> sw; subnode(P, {X1, Y1, X2, Y2}) -> nw. % 确定两个矩形是否相交 intersect({X1, Y1, X2, Y2}, {X3, Y3, X4, Y4}) -> not((X2 < X3) or (X1 > X4) or (Y2 < Y3) or (Y1 > Y4)). ``` 这个实现定义了一个点记录,一个矩形记录,和一个节点记录,节点记录包含四个子节点(NW,NE,SW,SE),一个矩形边界框,以及一个点列表。`insert/2`函数用于将一个点插入到4叉中,`search/2`函数用于搜索一个矩形内的所有点。`subnode/2`函数用于确定一个点在哪个象限中,`intersect/2`函数用于确定两个矩形是否相交。 这个实现是一个简单的版本,还可以添加更多功能,例如删除点,计算节点的平衡因子等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值