Erlang --- 监督机制

主动应用的目的就在于启动一个或多个进程以完成特定的任务,为了加强控制,这些进程应该由监督者——也就是实现了supervisor行为模式的进程——统一派生和管理。

监督者是Erlang/OTP的核心之一,主动OTP应用由一个或多个进程组成,它们相互协作共同完成任务,监督者间接启动这些进程,对这些进程负责,并在必要时重启它们。本质上说,在运行时,应用就是一棵由监督者和工作进程共同构成的进程树,树根就是根监督者。

根监督者行为模式模块的命名:根监督者行为模式的实现模块通常被命名为<application_name>_sup

-module(cowboy_sup).

-behaviour(supervisor).

-export([start_link/0]). 

-export([init/1]). 

-define(SUPERVISOR, ?MODULE).

 

-spec start_link() -> {ok, pid()}.

start_link() ->

    supervisor:start_link({local, ?SUPERVISOR}, ?MODULE, []).     %% 启动监督者

 

-spec init([]) -> {'ok', {{'one_for_one', 10, 10}, [{

    any(), {atom() | tuple(), atom(), 'undefined' | [any()]},

    'permanent' | 'temporary' | 'transient',

    'brutal_kill' | 'infinity' | non_neg_integer(),

    'supervisor' | 'worker',

    'dynamic' | [atom() | tuple()]}]

}}.

init([]) ->

    Procs = {cowboy_clock, {cowboy_clock, start_link, []},            %% 指明如何启动和管理子进程

        permanent, 5000, worker, [cowboy_clock]},

    {ok, {{one_for_one, 10, 10}, [Procs]}}.                                 %% 指明监督者的行为

 

start_link/3,其中一个调用参数是二元组{local,?SERVER},用于让OTP库在本地节点上以cowboy_sup为注册名自动注册监督进程。

init/1:子进程的启动策略、管理策略以及监督者进程本身的行为都是经由该函数的返回值告知给OTP监督者库的。

 

监督者重启策略

init/1回调函数的返回值的格式为{ok,{RestartStrategy,Children}},其中Children是若干子进程规范组成的一个列表,RestartStrategy只是一个三元组{How,Max,Within},此处它的值是{one_for_one, 10, 10}。

How取值为one_for_one,表示一旦有子进程退出,监督者将针对该进程,且仅针对该进程进行重启。该重启操作不会影响同时运行的其他进程。

one_for_one策略:给监督者静态指派的永久子进程会随监督者的启动而启动并在监督者的生命周期结束时退出。

simple_one_for_one策略:监督者只能启动一种子进程,但却可以启动任意多个,它所有的子进程都是运行时动态添加的,监督者本身在启动时不会启动任何子进程。动态添加子进程只需调用简化版supervisor:start_child/2函数,令监督者启动新的子进程。其他类型(非simple_one_for_one)的监督者在动态添加子进程时,必须将完整的子进程规范传递给start_child/2,例如:supervisor:start_child(?MODULE,{Mod, {Mod, start_link, Args},transient, 100, worker, [Mod]}),

Max和Within这两个值是相互关联的:它们共同确定了重启频率。Max指定的是最大重启次数,Within指定的是时间片,这里Max = 10,Within = 10,表示监督者最多可以在10秒内重启子进程10次,一旦超过限制,监督者都会在终止所有子进程后自我了断,并顺着监督者树向上汇报故障信息。如果这两个值分别取值为0和1,表示目前不启动自动重启,因为自动重启会妨碍我们发现代码中的潜在的问题。

 

子进程规范

子进程规范是一个用于描述受监督者管理的进程的元组。对于大多数监督者而言,子进程会随监督者的启动而启动并在监督者的生命周期结束时退出。对于单个需要监督的进程,init/1函数给出的描述如下:

Procs = [{cowboy_clock, {cowboy_clock, start_link, []},permanent, 5000, worker, [cowboy_clock]}]

子进程规范有6个元素组成:{ID,Start,Restart,Shutdown,Type,Modules}

ID:是一个用于在系统内部标识各规范的项式,简单起见,此处采用的是模块名

Start:是一个用于启动进程的三元组{Module,Function,Arguments},Module是模块名,Function是函数名,Arguments是函数的调用参数列表

Restart:用于指明子进程发生故障时是否需要重启。permanent 子进程总会被重启;temporary 子进程从不会被重启;transient 子进程只有当其被异常终止时才会被重启,即,退出理由不是 normal 。

Shutdown:用于指明如何终止进程。如果取值为一个整数,表示终止进程时应采用软关闭策略,给进程留出一段自我了断的时间(以毫秒为单位),如果进程未能在指定时间内自行退出,将被无条件终止;如果取值为brutal_kill,表示在关闭监督进程时立即终止子进程;如果取值为infinity,主要用于子进程本身也同为监督者的情况,表示应给予子进程充分的时间自行退出。

Type:用于表示进程是监督者(supervisor)还是工作者(worker)。

Modules:列出该进程所依赖的模块。这部分信息仅用于在代码热升级时告知系统该以何种顺序升级各个模块,一般来说,只需列出子进程的主模块。

转载于:https://www.cnblogs.com/hzy1987/p/5443080.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值