Supervisor行为分析和实践
1.简介
2.分析
2.1 重启策略
rest_for_one:针对一个子进程列表,一个子进程停止,停止列表中该子进程及后面的子进程,并依次重启这些子进程
2.2 最大重启频率
2.3 子进程说明
child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules}
Id = term()
StartFunc = {M,F,A}
M = F = atom()
A = [term()]
Restart = permanent | transient | temporary
Shutdown = brutal_kill | int()>0 | infinity
Type = worker | supervisor
Modules = [Module] | dynamic
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实例
-module(add_sup). -behaviour(supervisor). -export([start_link/0, start_child/0]).
-export([init/1]). -define(SERVER, ?MODULE). start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
start_child() ->
supervisor:start_child(?MODULE, []). init([]) ->
RestartStrategy = simple_one_for_one,
MaxRestarts = 2,
MaxSecondsBetweenRestarts = 100, SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, Restart = permanent,
Shutdown = 20000,
Type = worker, AChild = {add2, {add2, start_link, []},
Restart, Shutdown, Type, [add2]}, {ok, {SupFlags, [AChild]}}.
通过调用start_child/0来动态的加入子进程。
start_link() ->
gen_server:start_link(?MODULE, [], []).

3.2 普通子进程添加到监控树
普通子进程代码:
-module(common).
-author("Administrator"). -export([start_link/0, start_loop/2]). start_link() ->
Res = proc_lib:start_link(?MODULE, start_loop, [self(), ?MODULE]), %%启动一个普通进程
Res. start_loop(Parent,Name) ->
register(Name, self()), %%给普通进程命名,否则默认是pid()。
proc_lib:init_ack(Parent, {ok, self()}),
loop(). loop()->
receive
Args ->
io:format("args:~p~n",[Args])
end.
{common, {common, start_link, []}, permanent, 10000, worker, [common]}
普通子进程的终止与重启:
3.3 重启动态添加的子进程
对于监控树A的一个子进程是另一颗监控树B,监控树B有多个动态加入的子进程,若B重启后那么动态加入的子进程将不复存在,若B重启后需要想重新加入这些子进程,一、记录动态加入子进程的信息,当监控树重启后再动态加入以前的子进程;二、改进supervisor的实现,可以重启动态加入的子进程(未实践,rabbitmq中对supervisor修改来实现这个功能)。
init([]) ->
{ok, ets:new(proc_ets,[duplicate_bag, public, named_table, {keypos,1}])}.
当前监控树
2.动态加入子进程,并记录信息;重启子监控树,并动态加入子进程
-module(add_sup).
-include("ets_arg.hrl").
-behaviour(supervisor). -export([start_link/0, start_child/1]).
-export([init/1]). -define(SERVER, ?MODULE). -spec(start_link() ->
{ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
start_link() ->
{ok, Pid} = supervisor:start_link({local, ?SERVER}, ?MODULE, []),
case ets:lookup(?ETS, ?MODULE) of
Object -> load_dynamic_proc(Object) %% 动态的加入存储的子进程
end,
{ok, Pid}. start_child(_Type) ->
{ok, Pid} = supervisor:start_child(?MODULE, []),
case _Type of
restart -> ok;
_->ets:insert(?ETS,{?MODULE, ?SIMPLE, []}) %% 存储动态加入子进程的信息
end,
{ok, Pid}. init([]) ->
RestartStrategy = simple_one_for_one,
MaxRestarts = 2,
MaxSecondsBetweenRestarts = 100, SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts}, Restart = permanent,
Shutdown = brutal_kill,
Type = worker, AChild = {add2, {add2, start_link, []},
Restart, Shutdown, Type, [add2]}, {ok, {SupFlags, [AChild]}}. load_dynamic_proc([])->
ok;
load_dynamic_proc([H|T]) ->
start_child(restart),
load_dynamic_proc(T),
{ok, H}.





4.总结
Supervisor行为分析和实践的更多相关文章
- Log4j2分析与实践
当前网络上关于Log4j2的中文文章比较零散,这里整理了一下关于Log4j2比较全面的一些文章,供广大技术人员参考 Log4j2分析与实践-认识Log4j2 Log4j2分析与实践-架构 Log4j2 ...
- 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用
https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...
- 《Linux内核分析》实践4
<Linux内核分析> 实践四--ELF文件格式分析 20135211李行之 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格 ...
- 自定义View系列教程04--Draw源码分析及其实践
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- Gen_server行为分析与实践
1.简介 Gen_server实现了通用服务器client_server原理,几个不同的客户端去分享服务端管理的资源(如图),gen_server提供标准的接口函数和包含追踪功能以及错误报告来实现通用 ...
- AWVS结果分析与实践-XSS
今天趁着老师接项目,做了一丢丢实践,以下是一点点感触. 都知道AWVS是神器,可是到我手里就是不灵.拿了它扫了一个URL,结果提示XSS漏洞,实践没反应,只好愉快地享受了过程.来看看. ...
- 基于redis的分布式锁的分析与实践
前言:在分布式环境中,我们经常使用锁来进行并发控制,锁可分为乐观锁和悲观锁,基于数据库版本戳的实现是乐观锁,基于redis或zookeeper的实现可认为是悲观锁了.乐观锁和悲观锁最根本的区别在于 ...
- FastText 分析与实践
一. 前言 自然语言处理(NLP)是机器学习,人工智能中的一个重要领域.文本表达是 NLP中的基础技术,文本分类则是 NLP 的重要应用.在 2016 年, Facebook Research 开源了 ...
- 面经手册 · 第17篇《码农会锁,ReentrantLock之AQS原理分析和实践使用》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 如果你相信你做什么都能成,你会自信的多! 千万不要总自我否定,尤其是职场的打工人.如 ...
随机推荐
- lintcode:整数排序||
题目 给一组整数,按照升序排序.使用归并排序,快速排序,堆排序或者任何其他 O(n log n) 的排序算法. 解题 归并排序 public class Solution { /** * @param ...
- Project Euler 107:Minimal network 最小网络
Minimal network The following undirected network consists of seven vertices and twelve edges with a ...
- C#程序大打开
打开一个已经存在的工程: 1.用vs打开(.sln)解决方案的文件.(若提示VS提示版本不一致,可用方法二) 2.删除(.sln)的文件.打开项目(.csproj) 文件或 (.vbproj) 文件, ...
- RHEL7.2下netcat工具安装教程
1.下载 下载地址:http://sourceforge.net/projects/netcat/files/netcat/0.7.1/(下载的是netcat-0.7.1.tar.gz版本) 2.解压 ...
- Android SurfaceView + MediaPlayer实现分段视频无缝播放
Android当中实现视频播放的方式有两种,即:通过VideoView实现或者通过SurfaceView + MediaPlayer实现. 由浅至深,首先来看下想要在Android上播放一段视频,我们 ...
- 运行java -version报cannot restore segment prot after reloc: Permission denied
linux 安装jdk1.6后,运行java -version,没有出现相关的版本信息,而是出现了以下错误: dl failure on line 685Error: failed /usr/loca ...
- Git查看、删除、重命名远程分支和tag【转】
转自:http://zengrong.net/post/1746.htm 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也 ...
- iReport —— 使用 JavaBean 作为数据源
在制作报表时,想直接使用Java代码提供数据. 网上找了一些文章,很多都是用Servlet做的.我不是想通过浏览器来观察它的输出.我想使用iReport的动态连接直接预览. 结合一些资料,加上自己的摸 ...
- 《OD学hadoop》第一周0626 作业二:Linux基础
一.打包压缩 知识点: tar -zxvf -C PATH tar -jxvf tar -zcvf tar -jcvf tar:打包命令 -z 打包同时gzip压缩 -j 打包同时bzip2 -c 打 ...
- hdu4760Good Firewall
4760 数组模拟就可以了 读的时候可以整数读入 #include <iostream> #include<cstdio> #include<cstring> #i ...