Supervisor行为分析和实践
转载的这里 http://www.cnblogs.com/liuweiccy/p/4622075.html
1.简介
2.分析
2.1 重启策略
rest_for_one:针对一个子进程列表,一个子进程停止,停止列表中该子进程及后面的子进程,并依次重启这些子进程
2.2 最大重启频率
2.3 子进程说明
1 child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules}2 Id = term()3 StartFunc = {M,F,A}4 M = F = atom()5 A = [term()]6 Restart = permanent | transient | temporary7 Shutdown = brutal_kill | int()>0 | infinity8 Type = worker | supervisor9 Modules = [Module] | dynamic 10 Module = atom()
permanent:子进程总是被重启
Shutdown:关闭时间
Type:子进程的类型 worker | supervisor
Modules : 回调模块
如果子进程是supervisor、gen_server、gen_fsm则Modules是回调模块name的列表,如果为gen_event则为dynamic。(未验证)
3.实例
3.1 simple_one_for_one实例
1 -module(add_sup).2 3 -behaviour(supervisor).4 5 -export([start_link/0, start_child/0]).6 -export([init/1]).7 8 -define(SERVER, ?MODULE).9 10 start_link() -> 11 supervisor:start_link({local, ?SERVER}, ?MODULE, []). 12 start_child() -> 13 supervisor:start_child(?MODULE, []). 14 15 init([]) -> 16 RestartStrategy = simple_one_for_one, 17 MaxRestarts = 2, 18 MaxSecondsBetweenRestarts = 100, 19 20 SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, 21 22 Restart = permanent, 23 Shutdown = 20000, 24 Type = worker, 25 26 AChild = {add2, {add2, start_link, []}, 27 Restart, Shutdown, Type, [add2]}, 28 29 {ok, {SupFlags, [AChild]}}.
通过调用start_child/0来动态的加入子进程。
1 start_link() -> 2 gen_server:start_link(?MODULE, [], []).
3.2 普通子进程添加到监控树
普通子进程代码:
1 -module(common).2 -author("Administrator").3 4 -export([start_link/0, start_loop/2]).5 6 start_link() ->7 Res = proc_lib:start_link(?MODULE, start_loop, [self(), ?MODULE]), %%启动一个普通进程8 Res.9 10 start_loop(Parent,Name) -> 11 register(Name, self()), %%给普通进程命名,否则默认是pid()。 12 proc_lib:init_ack(Parent, {ok, self()}), 13 loop(). 14 15 loop()-> 16 receive 17 Args -> 18 io:format("args:~p~n",[Args]) 19 end.
1 {common, {common, start_link, []}, permanent, 10000, worker, [common]}
普通子进程的终止与重启:
3.3 重启动态添加的子进程
对于监控树A的一个子进程是另一颗监控树B,监控树B有多个动态加入的子进程,若B重启后那么动态加入的子进程将不复存在,若B重启后需要想重新加入这些子进程,一、记录动态加入子进程的信息,当监控树重启后再动态加入以前的子进程;二、改进supervisor的实现,可以重启动态加入的子进程(未实践,rabbitmq中对supervisor修改来实现这个功能)。
1 init([]) -> 2 {ok, ets:new(proc_ets,[duplicate_bag, public, named_table, {keypos,1}])}.
当前监控树
2.动态加入子进程,并记录信息;重启子监控树,并动态加入子进程
1 -module(add_sup).2 -include("ets_arg.hrl").3 -behaviour(supervisor).4 5 -export([start_link/0, start_child/1]).6 -export([init/1]).7 8 -define(SERVER, ?MODULE).9 10 -spec(start_link() -> 11 {ok, Pid :: pid()} | ignore | {error, Reason :: term()}). 12 start_link() -> 13 {ok, Pid} = supervisor:start_link({local, ?SERVER}, ?MODULE, []), 14 case ets:lookup(?ETS, ?MODULE) of 15 Object -> load_dynamic_proc(Object) %% 动态的加入存储的子进程 16 end, 17 {ok, Pid}. 18 19 start_child(_Type) -> 20 {ok, Pid} = supervisor:start_child(?MODULE, []), 21 case _Type of 22 restart -> ok; 23 _->ets:insert(?ETS,{?MODULE, ?SIMPLE, []}) %% 存储动态加入子进程的信息 24 end, 25 {ok, Pid}. 26 27 init([]) -> 28 RestartStrategy = simple_one_for_one, 29 MaxRestarts = 2, 30 MaxSecondsBetweenRestarts = 100, 31 32 SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, 33 34 Restart = permanent, 35 Shutdown = brutal_kill, 36 Type = worker, 37 38 AChild = {add2, {add2, start_link, []}, 39 Restart, Shutdown, Type, [add2]}, 40 41 {ok, {SupFlags, [AChild]}}. 42 43 load_dynamic_proc([])-> 44 ok; 45 load_dynamic_proc([H|T]) -> 46 start_child(restart), 47 load_dynamic_proc(T), 48 {ok, H}.
4.总结
Supervisor行为分析和实践相关推荐
- eBCC性能分析最佳实践(1) - 线上lstat, vfs_fstatat 开销高情景分析...
Guide: eBCC性能分析最佳实践(0) - 开启性能分析新篇章 eBCC性能分析最佳实践(1) - 线上lstat, vfs_fstatat 开销高情景分析 eBCC性能分析最佳实践(2) - ...
- 《Linux内核分析》实践4
<Linux内核分析> 实践四--ELF文件格式分析 20135211李行之 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格 ...
- 大数据主题分享第三期 | 基于ELK的亿级实时日志分析平台实践
猫友会希望建立更多高质量垂直细分社群,本次是"大数据学习交流付费群"的第三期分享. "大数据学习交流付费群"由猫友会联合,斗鱼数据平台总监吴瑞诚,卷皮BI技术总 ...
- THOR:MindSpore 自研高阶优化器源码分析和实践应用
摘要:这篇文章跟大家分享下THOR的实践应用.THOR算法的部分内容当前已经在MindSpore中开源 本文分享自华为云社区<MindSpore 自研高阶优化器源码分析和实践应用>,原文作 ...
- 构建集中式会话的分析与实践(一)
2019独角兽企业重金招聘Python工程师标准>>> 前言 我们都知道,在传统的单机环境中,设置一个用户的会话信息(session),一般用request.getSession() ...
- 【三维点云处理】PCA主成分析+实践(一)
PCA主成分析+实践 PCA简介 python代码 实验结果 PCA简介 PCA 旨在找到线性不相关的正交轴,也称为m维空间中的主成分 (PC),以将数据点投影到这些 PC 上.第一个 PC 捕获数据 ...
- 11.NDP协议分析与实践
NDP 协议分析与实践 1. 概述 1.1 简介 Neighbor Discovery Protocol 基于 ICMPv6 实现,用于替代 IPv4 中的 ARP 和 ICMP 路由器发现 基于 I ...
- 基于Transformer的文本情感分析编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制 + Positional Encoding位置编码)
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...
- MaxCompute用量明细账单分析最佳实践
MaxCompute用量明细账单分析最佳实践 MaxCompute中计算资源的计费方式分为包年包月和按量计费两种,产品每天会以Project为维度进行计费(账单会在第二天上午6点前生成). 用量详情账 ...
最新文章
- 极验行为验证的使用方法
- 【 MATLAB 】如何产生一个均值和方差可控的正态分布矩阵(randn)?
- mysql按逗号拼接起来_MySQL ----- 计算字段(Trim,Concat,as)(九)
- oracle登录账号和密码,oracle 登录账号与密码oracle按照中文排序
- 如何基于Weex实现创新交互体验?手淘开源技术BindingX案例解析
- 为脚本语言平反-JavaScript篇(3)
- Deeplab V1、v2要点
- html5 drawimage参数,HTML canvas
- 12月数据库榜单,整体排名稳定如昨,Oracle 分数接连下降
- react 解决 setState 异步问题
- C语言将字符串转json
- java adt简单开发,Windows 7 部署 Android 开发环境傻瓜式教程(Eclipse+ADT)
- Map转成JSON对象
- MATLAB 【学习视频推荐】——新手必备
- id门禁卡复制到手机_手机NFC也可以刷ID卡门禁?无聊测试居然成功了!
- 随机抖音接口php,【php】下载抖音无水印视频接口
- 超级强大灵活的文件批量修改文件名工具,彻底告别手工改名的烦恼
- 前端面试题及解答(尽量口语化,模拟面试现场时的回答)
- sqrt函数实现(涉及3D游戏引擎源码)
- 51单片机生日快乐歌c语言,51单片机实现生日快乐歌