- 浏览: 2682913 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
Supervisor Behaviour是一个用来实现一个supervisor进程来监控其他子进程的模块
子进程可以是另一个supervisor,也可以是一个worker进程
worker进程一般使用gen_event,gen_fsm或gen_server behaviour来实现
一个使用该模块来实现的supervisor有一个接口方法的标准集,包括跟踪和错误报告的功能
supervisor用来构建一个分层进程结构,称为supervision tree,这是组织一个容错系统的好方式
1,Supervision原则
supervisor负责启动、停止和监控它的子进程
supervisor在必要时通过重启它的子进程来保持它们活着
supervisor的子被定义为一个子规范的list
当supervisor启动时,子进程按list从左至右的顺序启动
当supervisor终止时,它首先按启动顺序的反顺序终止它的子进程
2,例子
启动服务器的supervisor的callback模块:
one_for_one是重启策略之一
1和60定义了最大重启频率
tuple {ch3, ...}是子规范
3,重启策略
3.1 one_for_one
如果一个子进程停止,则只重启该进程
3.2 one_for_all
如果一个子进程停止,所有其他子进程也停止,然后所有进程重启
3.3 rest_for_one
如果一个子进程停止,则启动顺序中在它之后的所有其他子进程也停止,然后停止的这些进程重启(跟楼上那位不一样)
3.4 simple_one_for_one
一个简化的one_for_one supervisor,所有的子进程都是同样进程类型并且是动态添加的实例
4,最大重启频率
supervisor有一个自带的机制来限制给定时间内重启的次数
这是通过MaxR和MaxT这两个参数来决定的
如果在最近的MaxT秒之内有超过MaxR次数的重启,则supervisor停止它本身和它所有的子进程
当supervisor停止后,下一个更高级别的supervisor进行下一步动作,重启该停止的supervisor或者终止本身
重启机制的意图是防止一个进程由于某些原因重复性的死掉
5,子规范
这是子规范的类型定义:
Id是用来让supervisor内部识别子规范的名字
StartFunc定义了用来启动子进程的的方法,符合module-function-arguments tuple{M, F, A}
它应该调用supervisor:start_link,gen_server:start_link,gen_fsm:start_link或gen_event:start_link,或相适应的方法
Restart定义了子进程什么时候重启
1)permanent表示子进程始终重启
2)temporary表示子进程决不重启
3)transient表示只有在子进程异常终止时才重启,即除了normal以外的终止原因
Shutdown定义了子进程怎样终止
1)brutal_kill表示子进程使用exit(Child, kill)来无条件的终止
2)一个整数timeout值表示supervisor告诉子进程通过调用exit(Child, shutdown)来终止,然后等待一个exit信号返回
如果没有在指定的时间内接收到exit信号,则子进程使用exit(Child, kill)来无条件的终止
3)如果子进程是另一个supervisor,它应该设置为infinity来给子树足够的时间来终止
Type指定子进程是一个supervisor还是一个worker
Modules应该是一个list,含有一个元素[Module]
如果子进程是一个supervisor,gen_server或gen_fsm则Module是callback模块的名字
如果子进程是一个gen_event,则Modules应该为dynamic
该信息用来在升级和降级时供release handler使用
例子:启动服务器ch3的子规范
例子:启动event manager的子规范
服务器和event manager都是注册进程,可以在任何时候访问,这样它们都指定为permanent
ch3不需要在终止之前做任何清理工作,这样就不需要timeout,但是必须满足brutal_kill,error_man可能需要一些时间来让event handler清理,这样Shutdown设置为5000ms
例子:启动另一个supervisor的子规范
6,启动一个supervisor
上面的例子通过调用ch_sup:start_link()来启动supervisor:
ch_sup:start_link调用方法supervisor:start_link/2,这个方法启动一个新的supervisor进程并连接它
1)第一个参数ch_sup是callback模块的名字,它是init callback方法所在的位置
2)第二个参数[]是传给init callback方法的参数
一个supervisor进程调用callback方法ch_sup:init([]),返回{ok, StateSpec}:
然后根据指定的子规范的入口来启动它的所有子进程,在这里有一个子进程ch3
注意supervisor:start_link是同步带,当作有子进程启动之后才会返回
7,添加一个子进程
除了静态的supervision tree,我们也可以添加动态子进程到已有的supervisor里:
Sup是supervisor的pid或名字,ChildSpec是子规范
使用start_child/2来添加的子进程表现出像其他子进程一样的行为,除了这点:如果supervisor死掉然后重启,则所有动态添加的子进程都将丢失
8,停止一个子进程
任何子进程,不管静态的还是动态的,都可以使用shutdown规范来停止:
停止的子进程的子规范使用如下调用来删除:
Sup是supervisor的pid或name,Id是子规范里指定的id
就像动态添加的子进程一样,如果supervisor本身重启,那么删除静态子进程的效果会丢失
9,simple_one_for_one supervisor
simple_one_for_one重启策略的supervisor是一个简化的one_for_one supervisor,所有的子进程都是动态添加的同一进程的实例
一个simple_one_for_one supervisor callback模块的例子:
当启动后,supervisor将不会启动任何子进程,而是通过调用如下代码来动态添加所有的子进程:
Sup是supervisor的pid或name,List是一个任意的term列表,将会被动态添加到子规范的参数列表里
如果启动方法指定为{M, F, A},则子进程通过调用apply(M, F, A++List)来启动
例如,添加一个子进程到simple_sup:
这将会通过调用apply(call, start_link, []++[id1])即call:start_link(id1)来启动子进程
10,终止
既然supervisor是supervision tree的一部分,则它将自动被它的supervisor终止
当终止时,它会按启动的反顺序根据相应的shudown规范来自动终止它所有的子进程,然后终止本身
补充:supervisor exports and callbacks
子进程可以是另一个supervisor,也可以是一个worker进程
worker进程一般使用gen_event,gen_fsm或gen_server behaviour来实现
一个使用该模块来实现的supervisor有一个接口方法的标准集,包括跟踪和错误报告的功能
supervisor用来构建一个分层进程结构,称为supervision tree,这是组织一个容错系统的好方式
1,Supervision原则
supervisor负责启动、停止和监控它的子进程
supervisor在必要时通过重启它的子进程来保持它们活着
supervisor的子被定义为一个子规范的list
当supervisor启动时,子进程按list从左至右的顺序启动
当supervisor终止时,它首先按启动顺序的反顺序终止它的子进程
2,例子
启动服务器的supervisor的callback模块:
-module(ch_sup). -behaviour(supervisor). -export([start_link/0]). -export([init/1]). start_link() -> supervisor:start_link(ch_sup, []). init(_Args) -> {ok, {{one_for_one, 1, 60}, [{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}]}}.
one_for_one是重启策略之一
1和60定义了最大重启频率
tuple {ch3, ...}是子规范
3,重启策略
3.1 one_for_one
如果一个子进程停止,则只重启该进程
3.2 one_for_all
如果一个子进程停止,所有其他子进程也停止,然后所有进程重启
3.3 rest_for_one
如果一个子进程停止,则启动顺序中在它之后的所有其他子进程也停止,然后停止的这些进程重启(跟楼上那位不一样)
3.4 simple_one_for_one
一个简化的one_for_one supervisor,所有的子进程都是同样进程类型并且是动态添加的实例
4,最大重启频率
supervisor有一个自带的机制来限制给定时间内重启的次数
这是通过MaxR和MaxT这两个参数来决定的
init(...) -> {ok, {{RestartStrategy, MaxR, MaxT}, [ChildSpec, ...]}}.
如果在最近的MaxT秒之内有超过MaxR次数的重启,则supervisor停止它本身和它所有的子进程
当supervisor停止后,下一个更高级别的supervisor进行下一步动作,重启该停止的supervisor或者终止本身
重启机制的意图是防止一个进程由于某些原因重复性的死掉
5,子规范
这是子规范的类型定义:
{Id, StartFunc, Restart, Shutdown, Type, Modules} Id = term() StartFunc = {M, F, A} M = F = atom() A = [term()] Restart = permanent | transient | temporary Shutdown = brutal_kill | integer() >=0 | infinity Type = worker | supervisor Modules = [Module] | dynamic Module = atom()
Id是用来让supervisor内部识别子规范的名字
StartFunc定义了用来启动子进程的的方法,符合module-function-arguments tuple{M, F, A}
它应该调用supervisor:start_link,gen_server:start_link,gen_fsm:start_link或gen_event:start_link,或相适应的方法
Restart定义了子进程什么时候重启
1)permanent表示子进程始终重启
2)temporary表示子进程决不重启
3)transient表示只有在子进程异常终止时才重启,即除了normal以外的终止原因
Shutdown定义了子进程怎样终止
1)brutal_kill表示子进程使用exit(Child, kill)来无条件的终止
2)一个整数timeout值表示supervisor告诉子进程通过调用exit(Child, shutdown)来终止,然后等待一个exit信号返回
如果没有在指定的时间内接收到exit信号,则子进程使用exit(Child, kill)来无条件的终止
3)如果子进程是另一个supervisor,它应该设置为infinity来给子树足够的时间来终止
Type指定子进程是一个supervisor还是一个worker
Modules应该是一个list,含有一个元素[Module]
如果子进程是一个supervisor,gen_server或gen_fsm则Module是callback模块的名字
如果子进程是一个gen_event,则Modules应该为dynamic
该信息用来在升级和降级时供release handler使用
例子:启动服务器ch3的子规范
{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}
例子:启动event manager的子规范
{error_man, {gen_event, start_link, [{local, error_man}]}, permanent, 5000, worker, dynamic}
服务器和event manager都是注册进程,可以在任何时候访问,这样它们都指定为permanent
ch3不需要在终止之前做任何清理工作,这样就不需要timeout,但是必须满足brutal_kill,error_man可能需要一些时间来让event handler清理,这样Shutdown设置为5000ms
例子:启动另一个supervisor的子规范
{sup, {sup, start_link, []}, transient, infinity, supervisor, [sup]}
6,启动一个supervisor
上面的例子通过调用ch_sup:start_link()来启动supervisor:
start_link() -> supervisor:start_link(ch_sup, []).
ch_sup:start_link调用方法supervisor:start_link/2,这个方法启动一个新的supervisor进程并连接它
1)第一个参数ch_sup是callback模块的名字,它是init callback方法所在的位置
2)第二个参数[]是传给init callback方法的参数
一个supervisor进程调用callback方法ch_sup:init([]),返回{ok, StateSpec}:
init(_Args) -> {ok, {{one_for_one, 1, 60}, [{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}]}}.
然后根据指定的子规范的入口来启动它的所有子进程,在这里有一个子进程ch3
注意supervisor:start_link是同步带,当作有子进程启动之后才会返回
7,添加一个子进程
除了静态的supervision tree,我们也可以添加动态子进程到已有的supervisor里:
supervisor:start_child(Sup, ChildSpec)
Sup是supervisor的pid或名字,ChildSpec是子规范
使用start_child/2来添加的子进程表现出像其他子进程一样的行为,除了这点:如果supervisor死掉然后重启,则所有动态添加的子进程都将丢失
8,停止一个子进程
任何子进程,不管静态的还是动态的,都可以使用shutdown规范来停止:
supervisor:terminate_child(Sup, Id)
停止的子进程的子规范使用如下调用来删除:
supervisor:delete_child(Sup, Id)
Sup是supervisor的pid或name,Id是子规范里指定的id
就像动态添加的子进程一样,如果supervisor本身重启,那么删除静态子进程的效果会丢失
9,simple_one_for_one supervisor
simple_one_for_one重启策略的supervisor是一个简化的one_for_one supervisor,所有的子进程都是动态添加的同一进程的实例
一个simple_one_for_one supervisor callback模块的例子:
-module(simple_sup). -behaviour(supervisor). -export([start_link/0]). -export([init/1]). start_link() -> supervisor:start_link(simple_sup, []). init(_Args) -> {ok, {{simple_one_for_one, 0, 1}, [{call, {call, start_link, []}, temporary, brutal_kill, worker, [call]}]}}.
当启动后,supervisor将不会启动任何子进程,而是通过调用如下代码来动态添加所有的子进程:
supervisor:start_child(Sup, List)
Sup是supervisor的pid或name,List是一个任意的term列表,将会被动态添加到子规范的参数列表里
如果启动方法指定为{M, F, A},则子进程通过调用apply(M, F, A++List)来启动
例如,添加一个子进程到simple_sup:
supervisor:start_child(Pid, [id1])
这将会通过调用apply(call, start_link, []++[id1])即call:start_link(id1)来启动子进程
10,终止
既然supervisor是supervision tree的一部分,则它将自动被它的supervisor终止
当终止时,它会按启动的反顺序根据相应的shudown规范来自动终止它所有的子进程,然后终止本身
补充:supervisor exports and callbacks
supervisor module Callback module supervisor:start_link Module:init/1 supervisor:start_child supervisor:terminate_child supervisor:delete_child supervisor:restart_child supervisor:which_children supervisor:check_childspecs
发表评论
-
ECUG III -- Elrang中国用户组第三次活动
2008-11-06 11:00 2246详情请见: http://ecug.org/ 大家也帮忙宣传 ... -
Erlang内存管理和运行模式笔记
2008-09-25 16:40 5384Erlang进程非常轻量级 进程间通过消息传递进行通讯 进程接 ... -
Erlang:一个通用的网络服务器
2008-09-24 16:50 6135原文: Erlang: A Generalized TCP S ... -
Erlang里的make
2008-09-22 17:38 3739Erlang自带一个make工具 我们看一个例子 目录结构: ... -
介绍Erlang里的Record
2008-09-12 15:52 8583原文: Erlang: An Introduction to ... -
Erlang与ActionScript3采用JSON格式进行Socket通讯
2008-09-02 16:37 6294前提: 需要下载as3corelib来为ActionScrip ... -
Erlang的JSON库
2008-09-02 15:40 9353使用下列JSON库: http://www.lshift.ne ... -
Erlang和ActionScript3的Socket通讯
2008-09-02 13:18 2877server.erl -module(server). ... -
Erlang和Ruby的Socket通讯
2008-09-01 22:12 2318server.erl -module(server). ... -
Erlang实现简单Web服务器
2008-09-01 17:59 5783转贴一个简单的Web服务器: httpd.erl %% h ... -
Mnesia用户手册:五,Mnesia高级特性
2008-09-01 17:27 7050本章描述了构建分布式、容错的Mnesia数据库相关的高级特性: ... -
Mnesia用户手册:四,事务和其他访问上下文
2008-08-29 00:06 6812本章讲述Mnesia事务系统和事务属性,它们让Mnesia成为 ... -
Mnesia用户手册:三,构建Mnesia数据库
2008-08-27 21:46 9223本章详细介绍了设计Mnes ... -
Mnesia用户手册:二,Mnesia快速上手
2008-08-27 14:09 9106本章介绍了Mnesia: 1) ... -
Mnesia用户手册:一,介绍
2008-08-26 15:47 7786Mnesia是一个分布式数据 ... -
gen_event例子:terminal_logger
2008-08-25 16:23 1657定义三个terminal_logger: $$ termina ... -
OTP Design Principles: Gen_Event Behaviour
2008-08-25 16:06 18011,事件处理原则 在OTP里,event manager是一个 ... -
gen_fsm例子:code_lock
2008-08-22 18:35 2133改了一下代码,可以run了: %% code_lock.erl ... -
OTP Design Principles: Gen_Fsm Behaviour
2008-08-22 17:29 18271,有限状态机 FSM,有 ... -
gen_server Hello World
2008-08-22 13:45 1688简单的gen_server Hello World程序 代码 ...
相关推荐
Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...
### OTP设计原则详解 #### 概览 OTP(Open Telecom Platform)是Erlang/OTP框架的核心组成部分之一,它提供了一套成熟的、可扩展的、容错的应用程序设计模式。OTP设计原则指导开发者如何构建稳定可靠的分布式系统...
mta-otp-docker:Docker容器化MTA OTP前端
VUE OTP输入 Vue的OTP输入组件 演示: : 安装 npm i vue-otp-2 使用范例 在main.js中 import Vue from 'vue' import VueOtp2 from 'vue-otp-2' ; Vue . use ( VueOtp2 ) 在App.vue中 道具 名称 类型 默认 描述 ...
#otp-generator “ otp-generator”是简单的一次性密码生成器,可以用作密码生成器。 指数 安装 npm install otp-generator --save 用法 var otpGenerator = require ( 'otp-generator' ) otpGenerator . ...
react-native-otp-fieldReact本机OTP字段 :keycap_1: :keycap_2: :keycap_3: :keycap_4: :keycap_5:安装npm i react-native-otp-fieldRN <0.63 npm i react-native-otp-field@0.0.7一个可在android和iOS上运行的...
- Phoenix框架与OTP:Phoenix web框架充分利用了OTP,例如使用GenServer管理Web服务器的状态,利用PubSub进行实时通信。 5. 并发与并行计算: - 并发模型:理解Erlang/OTP中的进程并发是如何实现的,以及如何有效...
OTP控制器版本1.2的项目 特征 通过I2C接口与主机处理器通信 在开始时(引导阶段)或在测试模式下有NVM加载请求时,将OTP值加载到寄存器文件中 在测试模式下编程OTP 文件分发(v1.2) top ------ i2c verilog文件...
OTP管理器(Laravel库) OTP Manager是Laravel OTP库。 通过短信,电子邮件或其他方式通过一次密码验证用户。 您可以选择各种类型的身份验证方法,例如cookie或请求标头。 一些功能: 您可以创建OTP链接并通过电子...
安装要安装最新的稳定版本: npm install --save react-otp-input基本用法: import React , { Component } from 'react' ;import OtpInput from 'react-otp-input' ;export default class App extends Component { ...
uuu.php: 成功== true){otp:echo“ [+] Masukin Kode OTP Kamu Disini:”; $ otp = trim(fgets(STDIN)); $ data1 ='{“ scopes”:“ gojek transaction gojek只读”,“ grant_type”:“密码”,“ login_...
OTP视图 准备使用一次性密码组件。 用法 XML格式 < com .hololo.library.otpview.OTPView android : layout_width = " match_parent " android : layout_height = " wrap_content " android : gravity = " ...
Firebase OTP (One-Time Password) SMS 是一种常见的身份验证机制,特别是在移动应用中,它用于确保用户的安全登录。在这个场景中,我们使用JavaScript与Firebase的电话认证功能集成,为用户提供通过电话号码接收OTP...
Erlang and OTP in Action Martin Logan, Eric Merritt, and Richard Carlsson MEAP Began: August 2008 Softbound print: May 2010 (est.) | 500 pages ISBN: 1933988789 Part One: Getting Past Pure Erlang; ...
Android OTP提取器许多OTP应用程序不支持导出或备份其OTP机密。 切换应用程序将需要您重新生成所有令牌,如果您拥有很多令牌,这可能很乏味。 该应用程序可以从流行的Android OTP应用程序中提取令牌,并以标准格式...
MC30P6060A0-14pin OTP: 1K, RAM: 48B, IO: 12 MC30P6060A0-6pin OTP: 1K, RAM: 48B, IO: 4 MC30P6060A0-8pin OTP: 1K, RAM: 48B, IO: 6 MC30P6060A1-6pin OTP: 1K, RAM: 48B, IO: 4 MC30P6070A0-6pin OTP: 1K, RAM:...
OTP认证符合以下条件的Sapplice Appplicazione che lavora e salva i dati localmente: 通过OTP APP生成Genericione dei QR di configurazione Generazione codice OTP Verifica correto allineamento codici OTP L...
LFE OTP教程介绍该存储库包含中宣布的有关OTP的LFE教程系列的代码,并在完成时从那里链接更多代码。入门确保已安装Erlang,并且erl在$PATH 。 确保已安装git 。 下载代码: git clone ...
OTP授权 一个简单的应用程序,可让您与nginx一起实施一次性密码授权。 在ngx_http_auth_request_module的支持下安装nginx> = 1.5.4您可以使用以下命令进行检查 nginx -V 2>&1 | grep -qF -- --with-...
Flutter-OTP验证基于Flutter的OTP身份验证组件,用于使用Firebase身份验证通过OTP(一次性密码)验证您的手机号码。目录颤振支持版本-Flutter 1.17(稳定) 我们已经在上述版本中测试了我们的程序,但是您也可以在...