Erlang Behaviour行为模式之一:Supervisor之说明

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qqqrtretretee/article/details/84776775

具体文档详看这里
Supervisor(即主管进程,简称主管)负责启动、停止以及监控主管子进程。主要想法是当必需时,通过重启子进程保持他们的存活。通过子规范列表启动并监控子进程,按照规范列表的顺序启动进程并以反序终止进程。
通用服务器Behaviour中启动服务器的回调模块大概看起来是这样的:

-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}}.
  • 策略(strategy)
    ①one_for_one:如果某子进程被终止了,只重启该子进程
    ②all_for_one:如果某子进程被终止了,其它所有进程也终止然后全部按照list顺序重启
    ③rest_for_one:如果某子进程终止了,该进程以后的进程被终止并按照顺序重启
    ④simple_one_for_one:与one_for_one类似,通过动态添加实例启动进程,也就是在此策略下的主管不会马上启动,而是通过调用 supervisor:start_child(Sup, List) 函数才启动,其结果就是由apply(ch3, start_link, [] ++ List)调用的进程
  • 最大重启次数(intensity):超过次数则不再重启
  • 最大重启时间(period):超时则停止
  • 主管id(id):id用来识别主管的子进程
  • 启动函数(start):通过apply(M, F, A)启动
  • 重启策略(restart):
    ①permanent 决定了进程一直重启;
    ②temporary 一旦终结,不再重启;
    ③transient如果子进程发生除了以normal,shutdown或者{shutdown, Term}等为原因的异常,则进行重启。
  • 关闭(shutdown)决定着子进程如何被终结:
    ①brutal_kill意味着子进程通过exit/2无条件退出终结;
    ②整数型数值意味着进程收到退出信号后,N个单位时间后终结进程;
    ③infinity意味着如果子进程是另一主管进程,如果设置了infinity标识符,就表示该主管可以留出足够的时间退出。shutdown选项可选,如果进程是worker进程,则默认为5000毫秒;如果进程是主管,则默认infinity。
  • 类型(type)决定进程的类型:
    ①worker工作进程
    ②supervisor主管进程

猜你喜欢

转载自blog.csdn.net/qqqrtretretee/article/details/84776775
今日推荐