码迷,mamicode.com
首页 > 其他好文 > 详细

Erlang--OTP--Supervisor

时间:2014-11-13 11:05:40      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:ar   使用   sp   for   strong   on   art   代码   bs   

一、概念:

        Supervisor: 监控树

二、作用:

        用于监控其它的进程是否正常运行

三、定义监控树的行为和被监控的进程:

        1、整个监控树的重启策略:(如果一个进程停止了,如何处理)

                1、one_for_one  : 如果一个子进程停止了,则中重启访进程
                2、one_for_all    : 如果一个子进程停止,所有其他子进程也停止,然后所有进程重启
                3、rest_for_one : 如果一个子进程停止,则启动顺序中在它之后的所有其他子进程也停止, 然后

                                             重启停止进程
                4、simple_one_for_one:
                                      1、一个简化的one_for_one
                                      2、运行相同的代码,即只有一类子进程
                                      3、监控树启动后,不启动子进程
                                      4、动态添加

        2、重启频率:在一定的时间内(MaxT)(秒),重启的次数超过了最大的重启次数(MaxR),监控树就会关闭所有的子进程和其本身

        3、子进程的定义:
                Id       : 一个标记,自定义,来区分不同的进程
                StartFunc: {Mod, Fun, Args}
                Restart  :  
                        1、permanent:子进程总是重启
                        2、transient:子进程只会在非正常结束时,才会重启
                        3、temporary:绝对不重启,即除normal, shutdown, {shutdown,Term}之外的原因
                Shutdonw:
                        1、brutal_kill: 无条件终止,使用exit(Child, kill)
                        2、一个时间(非负):先使用exit(Child, shutdown),等待一段时间,如果没有返回的shutdown,就
                           使用exit(Child, kill),强制杀死进程
                        3、infinity: 一直等待,当子进程也是一个监控树的时候,强烈推荐这个,以便子树有足够的时间结束
                Type    :
                        1、supervisor :表明此进程也是一个监控树
                        2、worker     : 表示此进程是一个工作进程,即用来执行具体操作的进程
                Modules :
                        1、假如子进程是supervisor、gen_server 或 gen_fsm,那么Module,就是一个列表,里面仅仅包含一个模块的名称,eg: [ModeName];
                        2、假如子进程是gen_event,那么Modules应该是dynamic

四、一个supervisor模版的构成:

            1、start_link函数:用于创建监控树本身,这个函数中,仅仅调用 supervisor:start_link

                 1、start_link的参数(三个)
                      1、给监控树起一个名字,分为三种,local,global,via
                               1、{local, SupName}:    注册一个本地的名字
                               2、{global, SupName}:  注册一个全局的名字,跨节点
                               3、{via, Module, Name}: 没有成功?
                      2、监控树所在的模块
                      3、需要传给Module:init的函数,如果是多个参数的话,就用列表
                 2、返回值:
                      1、{ok, pid()}   : 成功
                      2、 ignore           : 如果Module:init函数返回ignore,就返回ignore
                      3、 {error, Why}:  失败
                 3、start_link,会调用Module:init的函数去找到重启策略与所有的子进程,start_link会在                               Modult:init初始化结束后,并且所有子进程都已经启动后,才会返回                        

            2、init函数: 返回整个对监控权的定义和被监控的子进程

                 init函数,仅仅返回一个类似于{ok, {{重启策略,MaxR, MaxT}, [AllChildProcess]}}的结构。

                        1、{重启策略,MaxR, MaxT}, 重启策略和最大重启频率

                        2、 [AllChildProcess], 定义被监控的子进程   

Erlang--OTP--Supervisor

标签:ar   使用   sp   for   strong   on   art   代码   bs   

原文地址:http://my.oschina.net/wangcan/blog/343712

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!