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 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 如果你相信你做什么都能成,你会自信的多! 千万不要总自我否定,尤其是职场的打工人.如 ...
随机推荐
- sublime3可用key
—– BEGIN LICENSE —–Nicolas HennionSingle User LicenseEA7E-8660758A01AA83 1D668D24 4484AEBC 3B04512C8 ...
- 李洪强经典iOS面试题11
#import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别? #import是Objective-C导入头文件的关键字, ...
- Android核心分析之二十三Andoird GDI之基本原理及其总体框架
Android GDI基本框架 在Android中所涉及的概念和代码最多,最繁杂的就是GDI相关的代码了.但是本质从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理. GDI主 ...
- MakeObjectInstance的简单理解
昨天把MakeObjectInstance的代码详细研究了一下,当然还有众多前辈高手们的帮助,终于大致搞明白了是怎么回事.但是给我顿悟的,不是高手们的帖子,而是来自我自己的一个疑惑,TObjectIn ...
- C++:异常的处理
6.4 异常处理 程序中常见的错误分为两大类:编译时期的错误和运行时期的错误. 编译时期的错误比较简单容易发现:主要是语法错误,如关键字拼写错误.缺分号.括号不匹配等 运行时期的错误比较难发现,甚至是 ...
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...
- vim编辑器配置
原文链接:https://github.com/ma6174/vim http://my.oschina.net/swuly302/blog/156784?fromerr=itaFZFMb https ...
- How to: Synchronize Files by Using Managed Code
The examples in this topic focus on the following Sync Framework types: FileSyncProvider FileSyncOpt ...
- WCF中配置文件解析
WCF中配置文件解析[1] 2014-06-14 WCF中配置文件解析 参考 WCF中配置文件解析 返回 在WCF Service Configuration Editor的使用中,我们通过配置工具自 ...
- leetcode:Palindrome Linked List
Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...