热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Erlangsupervisor

supervisor监控者supervisor模块提供了一个监控其他进程的进程。通过supervisor能够构建监控树,用于构造容错应用程序。监控者能够启动、关闭及

supervisor监控者

supervisor模块提供了一个监控其他进程的进程。通过supervisor能够构建监控树,用于构造容错应用程序。监控者能够启动、关闭及重启它的子进程。

supervisor进程通过supervisor:start_link(Module, Args)supervisor:start_link(SupName, Module, Args)启动,成功的话返回值为{ok, Pid}。此时会通过调用回调函数Module:init(Args)来初始化监supervisor进程,如果成功,init将返回{ok, {SupFlags, [ChildSpec]}}

其中,SupFlags定义了supervisor进程的重启策略,它是如下的maps:

#{strategy => one_for_one, % optionalintensity => 1, % optionalperiod => 5} % optional

或元组{strategy, intensity, period}

strategy表示子进程的重启策略,主要有以下几种:
one_for_one:一个子进程挂掉后,只有该子进程会被重启。默认选项;
one_for_all:一个子进程挂掉后,其他子进程也会被终止,然后重启所有子进程;
rest_for_one:一个子进程挂掉后,在该子进程后启动的子进程会被终止,然后重启这些子进程;
注意:所有子进程是按照列表顺序去启动的,终止时,按照列表顺序的逆序去终止。
simple_one_for_one:简单版的one_for_one,在这种策略下,所有子进程都是动态添加的。此时返回的ChildSpec只有一个元组。

intensityperiod共同指定supervisor的重启限度。默认为15,表示5s内最多重启1次,超过这个限度后,supervisor进程将会终止所有子进程和它本身。能够有效地防止supervisor无限重启。
注意,intensity=2period=10intensity=1period=5是不同的,{1,5}短时间内不允许重启2次而{2,10}是允许的。

ChildSpec定义为以下的maps:

#{id => Id, % mandatorystart => {M,F,A}}, % mandatoryrestart => permanet|temporary|transient, % optionalshutdown => brutal_kill|TimeOut, % optionaltype => supervisor|worker, % optionalmodules => modules()} % optional

或元组{id, start, restart, shutdown, type, modules}
id为子进程的标识符;
start是一个{M,F,A}元组,用于启动子进程,返回{ok,Child}{ok,Child,Info},Child为子进程的Pid;
restart是指定了子进程终止时的处理策略,permanent参数表示每次终止都重启,temporary表示不再重启(即使因为其他进程终止导致本进程终止而后需要重启的情况),transient表示只有当进程被意外终止才会重启,正常原因包括normal, shutdown, or {shutdown,Term},默认为permanent;
shutdown指定子进程的终止方式,brutal_kill表示通过调用exit(ChildPid, kill)终止子进程,TimeOut表示表示通过调用exit(ChildPid, shutdown)终止子进程,此时将会等待TimeOut ms等待子进程返回一个理由为shutdown的退出信号。当子进程为supervisor进程时,应该设置成infinity。默认为50000;
type指定子进程的类型,默认worker;
module指定回调模块,默认为{M,F,A}中的M

注意,在init返回后,supervisor会根据子进程列表[ChildSpec],启动所有的子进程。supervisor:start_link是同步调用,在所有子进程启动之前它不会返回。

可以通过supervisor:check_childspecs([ChildSpec])检查ChildSpec是否合法。
可以通过supervisor:count_children(SupRef)获取supervisor进程的子进程情况。
可以通过supervisor:start_child(SupRef, ChildSpec)动态启动一个子进程,不过该子进程在supervisor进程重启后将会丢失。
可以通过supervisor:terminate_child(SupRef, Id)终止一个子进程,无论该子进程是静态添加抑或是动态添加的。此处的Id,如果是动态添加的则必须为子进程Pid
可以通过supervisor:restart_child(SupRef, Id)重启一个子进程。此子进程必须在ChildSpecs中。
可以通过supervisor:delete_child(SupRef, Id)删除一个子进程,并从ChildSpecs中删除。


两个例子

%% one_for_one Supervisors
-module(ch_sup).
-behaviour(supervisor).-export([start_link/0]).
-export([init/1]).start_link() ->supervisor:start_link(ch_sup, []).init(_Args) ->SupFlags = #{strategy => one_for_one, intensity => 1, period => 5},ChildSpecs = [#{id => ch3,start => {ch3, start_link, []},restart => permanent,shutdown => brutal_kill,type => worker,modules => [cg3]}],{ok, {SupFlags, ChildSpecs}}.

%% Simplified one_for_one Supervisors
-module(simple_sup).
-behaviour(supervisor).-export([start_link/0]).
-export([init/1]).start_link() ->supervisor:start_link(simple_sup, []).init(_Args) ->SupFlags = #{strategy => simple_one_for_one,intensity => 0,period => 1},ChildSpecs = [#{id => call,start => {call, start_link, []},shutdown => brutal_kill}],{ok, {SupFlags, ChildSpecs}}.

对于Simplified one_for_one Supervisors而言,所有的子进程都是通过supervisor:start_child(Sup, [List])动态添加的,相当于调用apply(call, start_link, []++[List])call:start_link([List])。子进程通过supervisor:terminate_child(SupRef, Pid)终止。
需要注意的是,Simplified one_for_one Supervisors子进程的终止是异步的,终止顺序不可预测。


推荐阅读
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 本文介绍了在Go语言中可见性与scope的规则,包括在函数内外声明的可见性、命名规范和命名风格,以及变量声明和短变量声明的语法。同时,还介绍了变量的生命周期,包括包级别变量和局部变量的生命周期,以及变量在堆和栈上分配的规则和逃逸分析的概念。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • 在加载一个第三方厂商的dll文件时,提示“找不到指定模块,加载失败”。由于缺乏必要的技术支持,百思不得期间。后来发现一个有用的工具 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
author-avatar
mobiledu2502889283
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有