OTP中supervisor启动过程

Erlang/OTP 监督者(Supervisor) Erlang/OTP 监督者(Supervisor)的作用是负责其子进程的启动,停止和监视。监督者的基本思路是,保持其子进程能正常运行,并在必要时重新启动子进程。文章将从监督者配置参数和工作流程两方面来介绍。 阅读详情

 转载自庆亮的博客-webgame架构

从rabbit_sup模块开始看起:

rabbit_sup模块的start_link是被rabbit app模块的start/2方法所调用的

rabbit.erl文件:

start(normal, []) ->

{ok, SupPid} = rabbit_sup:start_link(),

rabbit_sup.erl文件:

-define(SERVER, ?MODULE).

start_link() ->

supervisor:start_link({local, ?SERVER}, ?MODULE, []).

这里的?SERVER和?MODULE是一样的值,都为rabbit_sup 。

跳转到supervisor.erl文件:

start_link(SupName, Mod, Args) ->

gen_server:start_link(SupName, supervisor, {SupName, Mod, Args}, []).

看到supervisor的start_link实际上调用的是gen_server的start_link方法,调用的时候将supervisor作为一个参数传递过去了。

这样到目前为止我们的调用实际为:

gen_server:start_link({local, rabbit_sup}, supervisor, {{local, rabbit_sup}, rabbit_sup, []}, []).

gen_server.erl文件:

start_link(Mod, Args, Options) ->

    gen:start(?MODULE, link, Mod, Args, Options).

start_link(Name, Mod, Args, Options) ->

gen:start(?MODULE, link, Name, Mod, Args, Options).

gen_server的start_link方法调用了gen模块的start方法,实际调用为:

gen:start(gen_server, link, {local, rabbit_sup},supervisor, {{local, rabbit_sup}, rabbit_sup, []}, []).

gen.erl文件:

start(GenMod, LinkP, Name, Mod, Args, Options) ->

    case where(Name) of

undefined ->

    do_spawn(GenMod, LinkP, Name, Mod, Args, Options);

Pid ->

    {error, {already_started, Pid}}

end.

start之前判断是否已经创建了该process,没有则创建,有则返回错误!

do_spawn(GenMod, link, Name, Mod, Args, Options) ->

    Time = timeout(Options),

    proc_lib:start_link(?MODULE, init_it,

[GenMod, self(), self(), Name, Mod, Args, Options],

Time,

spawn_opts(Options));

do_spawn(GenMod, _, Name, Mod, Args, Options) ->

    Time = timeout(Options),

    proc_lib:start(?MODULE, init_it,

   [GenMod, self(), self, Name, Mod, Args, Options], 

   Time,

   spawn_opts(Options)).

实际又是调用了gen模块的init_it方法,采用的link的spawn方式。

init_it(GenMod, Starter, Parent, Mod, Args, Options) ->

    init_it2(GenMod, Starter, Parent, self(), Mod, Args, Options).

init_it(GenMod, Starter, Parent, Name, Mod, Args, Options) ->

    case name_register(Name) of

true ->

    init_it2(GenMod, Starter, Parent, Name, Mod, Args, Options);

{false, Pid} ->

    proc_lib:init_ack(Starter, {error, {already_started, Pid}})

    end.

首先尝试注册这个名字,如果发现已经注册,则通知父进程已经创建了。否则跳转到init_in2,

init_it2(GenMod, Starter, Parent, Name, Mod, Args, Options) ->

GenMod:init_it(Starter, Parent, Name, Mod, Args, Options).

这时又跳转到gen_server:init_it方法。

init_it(Starter, self, Name, Mod, Args, Options) ->

    init_it(Starter, self(), Name, Mod, Args, Options);

init_it(Starter, Parent, Name0, Mod, Args, Options) ->

    Name = name(Name0),

    Debug = debug_options(Name, Options),

    case catch Mod:init(Args) of

{ok, State} ->

    proc_lib:init_ack(Starter, {ok, self()}),      

    loop(Parent, Name, State, Mod, infinity, Debug);

{ok, State, Timeout} ->

    proc_lib:init_ack(Starter, {ok, self()}),      

    loop(Parent, Name, State, Mod, Timeout, Debug);

{stop, Reason} ->

    %% For consistency, we must make sure that the

    %% registered name (if any) is unregistered before

    %% the parent process is notified about the failure.

    %% (Otherwise, the parent process could get

    %% an 'already_started' error if it immediately

    %% tried starting the process again.)

    unregister_name(Name0),

    proc_lib:init_ack(Starter, {error, Reason}),

    exit(Reason);

ignore ->

    unregister_name(Name0),

    proc_lib:init_ack(Starter, ignore),

    exit(normal);

{'EXIT', Reason} ->

    unregister_name(Name0),

    proc_lib:init_ack(Starter, {error, Reason}),

    exit(Reason);

Else ->

    Error = {bad_return_value, Else},

    proc_lib:init_ack(Starter, {error, Error}),

    exit(Error)

end.

又是调用了supervisor的init方法

    init({SupName, Mod, Args}) ->

    process_flag(trap_exit, true),

    case Mod:init(Args) of

{ok, {SupFlags, StartSpec}} ->

    case init_state(SupName, SupFlags, Mod, Args) of

{ok, State} when ?is_simple(State) ->

    init_dynamic(State, StartSpec);

{ok, State} ->

    init_children(State, StartSpec);

Error ->

    {stop, {supervisor_data, Error}}

    end;

ignore ->

    ignore;

Error ->

    {stop, {bad_return, {Mod, init, Error}}}

    end.

呵呵,到了这里终于调用了rabbit_sup的init方法了,根据不同的init返回值做不同的启动子进程的操作。

 

Erlang OTP:监督者(Supervisor)行为模式之监督者规格 监督者行为模式对应的监督者规格记录。 阅读详情

相关推荐

系统安全基石IP-OTPC(一):什么是OTP

今天和大家一起学习的是OTPC,既然在学习,我们就肯定要知道我们为什么要学习?因为我们是研究安全的,在安全启动的过程中,我们一直在说一个信任根的概念-ROT,我们知道这个根是放在BootRom或者Bias中去实现的。进一步我们知道安全必须是和硬件配合起来才能保证ROT的可信,才能建立整个启动链路信任机制,那在安全启动我们到底依赖了哪些硬件,脑子里肯定想起了ARM Core的TrustZone架构,不知道有没没想起之前我分享的TRNG、AES这些逻辑IP。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1017

脱机一次性口令OTP原理(将用户id加密到一串数字中)类似微信支付宝付款码,将军令等

离线二维码的技术原型是在行业中广泛使用的一次性口令(OTP, One-time Password),使用了该技术的产品除了有支付宝和微信,还有银行U盾、游戏令牌等硬件设备。 在翼支付的离线二维码上,方案的设计概述为: 1、  登录翼支付,服务器生成唯一token,通过加密方式(如https)传递到客户端。 2、  打开付款码时,本地生成一段含有token与当前时时间戳的哈希值,如

欢迎来到一度's博客 6097

深入理解OTP:Elixir中的进程、GenServer与Supervisor

本文介绍了Elixir中OTP框架的核心概念。OTP基于轻量级进程(actor模型),通过消息传递实现并发。文章详细讲解了进程的基本使用方式、接收-执行循环的实现,以及更高级的GenServer和Supervisor行为模式。GenServer提供了同步/异步调用的标准接口,而Supervisor则实现了进程监督和自动重启机制。这些机制共同构成了Elixir构建健壮分布式系统的基石,通过示例展示了如何实现一个简单的资金管理服务。

2501_90323865的博客 87

开源otp解决方案

1)搞定开源OTP解决方案了,哦也,不用花钱买巨贵的RSA token了!!感谢 @付超群@Nexpro ,手机身份验证用google的身份验证器,支持ios和安卓,搞定了sshd和openvpn的,下来搞web的。 (2)说一下原理:sshd用pam去用户家目录找.google_authenticator文件,用签名算法HMAC-SHA1对(时间或者计数器)+秘钥生成动态口令和手机的匹配。op

wenhuiqiao的专栏 6768

java-otp, Java的一次性口令( HOTP和 TOTP ) 库.zip

java-otp, Java的一次性口令( HOTP和 TOTP ) 库 Java otp是使用 Java HOTP ( RFC 4226 ) 或者 TOTP ( RFC 6238 ) 标准生成一次性密码的库。用法为了演示一次生成密码,我们将重点放在TOTP算法。 要创建默认密码长度为( 6位数字),

OTP:Java一次动态密码、付款码原理

1. 什么是OTP 一次性密码(One Time Password,简称OTP),又称“一次性口令”,是指只能使用一次的密码。 2. OTP原理 动态密码的产生方式,主要是以时间差做为服务器与密码产生器的同步条件。在需要登录的时候,就利用密码产生器产生动态密码,OTP一般分为计次使用以及计时使用两种,计次使用的OTP产出后,可在不限时间内使用;计时使用的OTP则可设置密码有效时间,从30秒到两分钟不等,而OTP在进行认证之后即废弃不用,下次认证必须使用新的密码,增加了试图不经授权访问有限制资源的难度。 计算公式: OTP(K,C) = Truncate(HMAC-SHA-1(K,C)

万字长文带你搞懂安全启动及ATF

既然是小白也能看懂,那么在开篇之前我先解释两个概念,相关从业者可以跳过这两点:• 什么是ATF?ARM Trusted Firmware中的Trusted Firmware-A(简称TF-A)。TF-A是Trusted Firmware Project中的一个项目。TF(Trusted Firmware)是ARM在Armv8引入的安全解决方案,为安全提供了整体解决方案。

生活需要深度 7357

NXP ChessDE的安装和激活

如果客户申请的是试用版,那么一份为期 30 天的 License 将会发送申请人的账号或邮箱中,客户使用该文件进行安装即可。② 将“VENDOR snpslmd /path/to/snpslmd”中的“/path/to/snpslmd”替换成 snpslmd.exe 实际存放路径(位于 SCL 安装目录下的 win32\bin 文件夹中,默认安装的情况下就是“VENDOR snpslmd C:\Synopsys\SCL\<version>\win32\bin\snpslmd.exe”)。

weixin_47351160的博客 2044

动态令牌-(OTP,HOTP,TOTP)

名词解释和基本介绍 OTP 是 One-Time Password的简写,表示一次性密码。 HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性密码。 是事件同步,通过某一特定的事件次序及相同的种子值作为输入,通过HASH算法运算出一致的密码。 TOTP 是Time-based One-Time Password的简写,表示基于时间...

轻耘智科技CTO 尤胜荣 的专栏 2591

便携式水下动态实时视频色彩还原设备,一键快速实现对水下偏色视频和图像的色彩还原处理

便携式水下动态实时视频色彩还原,一键快速对水下图像进行色彩校正,清晰度提升和亮度均衡处理,为水下资源勘探和科学考古,海洋生态环境监测,水下机器作业等应用提供有力的协助

weixin_43518680的博客 633

【回归预测】GRNN广义回归神经网络-MATLAB

广义回归神经网络(GRNN)是一种基于径向基函数(RBF)的神经网络模型,主要用于非线性回归任务。与传统的回归分析方法相比,GRNN具有更强的非线性映射能力和学习速度,能够快速逼近复杂的非线性关系。输入层、模式层、求和层和输出层。输入层接收输入数据,模式层通过径向基函数将输入映射到高维空间,求和层对模式层的输出进行加权求和,最后输出层生成预测结果。GRNN的核心思想是利用高斯核函数计算输入与训练样本之间的相似度,然后根据相似度加权平均得到预测值。

2303_77200324的博客 1091

supervisor与gen_server使用小结

supervisor与gen_server是OTP标准库中提供的两种behavior,其中gen_server是基础的公共服务器框架,supervisor本身就是一个gen_server behavior的实例。   supervisor behavior是建立监控树的基础,只有一个回调函数init(Arg),返回该监控进程的监控规格,其中包括了被监控子进程的重启模式,以及所有被监控子进...

juzejian的专栏 375

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)。

非科班Java出身GISer的博客 708

深入理解OTP Application:从概念到实践的运行时容器解析

在构建高可用、可维护的分布式系统时,进程管理与生命周期控制是核心挑战。Erlang/OTP框架通过标准化的组件抽象来解决这些工程化问题,其中OTP Application作为关键容器,定义了组件的生命周期、依赖关系和运行时行为。其原理基于静态资源文件与动态进程树的映射,通过Application Master、回调模块和根监督树三层结构实现统一管理。这一设计为系统提供了开箱即用的启动顺序控制、配置管理和错误隔离能力,特别适用于需要7x24小时运行、支持热更新的电信或即时通讯场景。通过理解OTP Applic

weixin_30326515的博客 315

prplOS介绍

介绍prplOS是什么,特性、框架、编译等。

四儿家的小祖宗的博客 2125

lammps 案例in文件汇总

进阶案例: 聚乙烯和石墨烯界面pull out模拟代码 反应力场reax/c设置方法及案例解析 石墨烯热导率模拟代码(NEMD方法) 圆锥形SiC纳米磨削单晶硅源代码 高熵合金FeNiCrCoCu纳米压痕模拟代码 fix indent命令实现纳米摩擦及摩擦力计算 Fe原子辐照轰击多层石墨烯模拟代码 铝基石墨烯复合物压缩变形in文件源代码 石墨烯自动卷曲到Fe纳米线模拟源代码 铝/石墨烯复合物结晶过程lammps模

lammps_jiayou的博客 9446

OTP 要点

?FILE 当前文件名 ?MODULE 当前module名 ?LINE 当前行数 gen_server exports and callbacks [code="java"] gen_server module callback module gen_server:start_link -------> ...

nuthell 337

RV1126笔记二十七:MetaRTC6移植

MetaRTC6移植

6038

Gleam OTP核心组件解析:从Actor到Supervisor的完整指南 [特殊字符]

如果你正在寻找构建**容错多核程序**的终极解决方案,那么Gleam OTP绝对是你不容错过的选择!这个基于BEAM虚拟机(Erlang运行时)的**Actor框架**为Gleam语言提供了强大的**进程监控**和**故障恢复**能力。无论你是想构建高可用的微服务、实时系统还是分布式应用,Gleam OTP都能为你提供坚实的**并发编程**基础。 ## 🔍 什么是Gleam OTP? Gle

gitblog_00621的博客 1123

DeepSeek+Dify之一安装部署

DeepSeek添加知识库

yilvyangguang520的博客 1545

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

erlang OTP supervisor 图解分析

原文链接: http://www.hoterran.info/otp-supervisor-sourcecode   supervisor实际上是基于gen_server的系统进程,监控子进程的退出状态并设置一定的重启机制. init 在这个例子里Mod模块是一个sup程序,它的启动会调用supervisor:start_link,而start_link实际上调用的gen_ser

至 秦 的技术博客 5183

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Gleam OTP性能优化:如何达到与Erlang OTP相当的执行效率?

Gleam OTP是一个基于BEAM actor框架的容错多核程序库,旨在为开发者提供类型安全的actor模型实现。本文将分享如何通过优化策略使Gleam OTP达到与Erlang OTP相当的执行效率,帮助开发者充分利用BEAM虚拟机的性能优势。 ## 为什么Gleam OTP性能值得关注? Gleam OTP作为BEAM生态的重要成员,其设计目标之一就是实现与Erlang OTP相当的性能

gitblog_01429的博客 362

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Erlang之supervisor入门

1.概念: supervisor是OTP框架四大行为之一,它用于监视别的进程,当一个进程崩溃是,它能够快速重启该进程,并根据不同的策略做出不同的行为。 2.常用函数: 1.start_link({local/global,NAME}, MODULE, Args). 创建一个supervisor的进程服务器,local为本地进程,global为全局进程,NAME为该进程名,...

fbher的博客 1305

Gleam OTP工厂监督器(Factory Supervisor)详解:动态管理Actor的高效方案

Gleam OTP工厂监督器(Factory Supervisor)是Gleam语言基于OTP框架实现的动态进程管理工具,专为高效创建和监控Actor进程而设计。它允许开发者通过预定义模板动态启动子进程,在程序运行时根据需求灵活扩展系统容量,同时提供完善的故障恢复机制,是构建容错多核程序的核心组件。 ## 什么是工厂监督器? 工厂监督器本质上是一种特殊的监督进程,采用Erlang/OTP中的`

gitblog_00019的博客 1001
上一篇: Erlang OTP之terminate 深入分析
下一篇: Erlang Programming拾零(经典)
jamesjun
博客等级 码龄19年 25粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值