为了便于理解我以一个标准的监督进程模块的例子开始这一部分
1
2
3
4
5
6
7
8
9
10
11 |
- module(zl_sup). - behaviour(supervisor). - export([start_link / 0 ]). - export([init / 1 ]). start_link() - > supervisor:start_link(zl_sup, []). init(_Args) - > {ok,{{one_for_one, 1 , 60 }},[{zl1,{zl1,start_link,[]},permanent,brutal_kill,worker,[ch3]}]}}. |
supervisor行为模式的作用是监督、停止和监视它的子进程。其中子进程的启动和监视操作由子进程规格确定(对应于上面例子中的蓝色部分)。(注意:我们启动子进程的时候是按照列表的顺序启动的,但是终止的时候是按照相反的顺序进行的)。
监督进程启动过程:
以上面的例子为例,我们可以通过调用zl_sup:start_link()启动监督进程。我们分析一下启动的过程。zl_sup:start_link()调用了函数supervisor:start_link/2,这个函数则会为我们启动并链接一个监督进程。例如supervisor:start_link(zl_sup, []).这里地一个参数zl_sup是回调模块的名字,也是我们监督进程的名字,第二个参数[]则会传递到回调函数init里面。上面例子init(_Args)用到了匿名参数,即我们会忽略到第二个参数。
接着通过调用回调函数我们便会按照启动子进程规格中的启动顺序启动子进程(从上面例子来看即启动子进程zl1).
这里我们要注意一点:supervisor:start_link 是同步的。只有所有的子进程都启动了,它才会返回。
{one_for_one}是重启策略
1和60指的是最大重启频率(以此例子为例 在60秒内的最大重启次数为1次,如果超过一次,那么监督进程则会终止它所监督的所有子进程,然后结束自己)
蓝色的元组部分质的是子进程规格
下面我们对重启策略和子进程规格进行详细解释
重启策略
(1) one_for_one
如果一个子进程终止了,监督进程仅将该进程重启。
(2) one_for_all
如果一个子进程终止了,那么所有其他的子进程都将会被终止,然后,监督进程将所有子进程重启(包括一开始终止的那个)。
(3) rest_for_one
如果一个子进程终止了,那么从该进程后面的子进程(子进程规格启动顺序在终止进程之后的子进程)都将被终止,然后启动这些被终止的子进程。
子进程规格
http://www.erlang.org/doc/man/supervisor.html(参考官方api)
{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---子进程规范的名称(对应于上面例子上面的 zl1)
StartFunc---启动子进程调用的模块 (对应于上面例子中的{zl1,start_link,[]},即启动子进程调用子进程的start/1)
Restart--定义了一个被终止的子进程在何时被重启
(1)permanet 子进程总会被重启
(2)temporary 子进程不会被重启
(3)transient 子进程只有当其被异常终止时才会被重启
Shutdown---定义了子进程如何被终止
(1)brutal_kill 表示子进程应该使用exit(Child, Kill)进行终止。
(2) 如果该处是一个整数值的话,则监督进程会先调用exit(Child,Shutdown)告诉子进程将要被终止,然后等待其返回退出信号。如果在指定的整数值时间内仍然没收到任何退出信号,那么将调用 exit(Child,Kill)进行无条件的终止。
(3)infinity 该情况适用于子进程也是supervisor类型,即子进程也是一个监督者的情况,我们必须给予子进程足够的时间进行终止操作。
谢谢大家阅读,欢迎大家批评指正。
推荐
http://erlang.shiningray.cn/otp-design-principles/supervisor.html
原文:http://www.cnblogs.com/zlerlang/p/3572315.html