何时在Erlang监督中重新启动进程?

时间:2016-07-19 06:48:26

标签: erlang

您能举例说明Erlang主管重启进程的示例吗?如果进程终止,它将重新启动。但是一个过程怎么死? 感谢。

1 个答案:

答案 0 :(得分:1)

您可以将Erlang shell中的内容作为示例,例如考虑序列:

1> self().
<0.32.0>
2> A = 1. 
1
3> self().
<0.32.0>
4> A = 2. 
** exception error: no match of right hand side value 2
5> self().
<0.37.0>

1&GT;第一个命令要求shell提示自己的Pid:<0.32.0>

2 - ;接下来,一个新命令将变量A设置为1,它起作用,因为A是未绑定的。

3&GT;对shell的新请求显示其Pid没有变化。

4&GT;尝试将A与整数2匹配失败,它会引发异常。事实上,在后台,shell进程终止,主管立即重新启动它。

5个可以通过新的请求来验证它获取shell Pid,现在它是<0.37.0>

6个当shell死亡时,它丢失了所有信息,并从头开始重新启动。但在初始化期间,它可以连接到负责保存会话历史的所有其他进程以及所有绑定变量。可以通过询问A:

的值来验证
6> A.
1

7个或者询问历史

7> h().
1: self()
-> <0.32.0>
2: A = 1
-> 1
3: self()
-> <0.32.0>
4: A = 2
-> {'EXIT',{{badmatch,2},[{erl_eval,expr,3,[]}]}}
5: self()
-> <0.37.0>
6: A

根据环境(硬件故障,通信丢失,错误参数,错误......),erlang进程可能因错误原因而死亡。如果它在监督树(或您自己的监控)中进行管理,则可以从头开始重新启动。应用程序有责任为所有流程提供恢复适当状态的方法。

erlang进程也可能因为&#34; normal&#34;而死,例如当用户关闭会话时(在shell中键入q()。),在这种情况下,主管不会重启它

您可以在网上找到许多有价值的信息:

design principle

erlang.org supervisor

learn you some erlang : run time errors

learn you some erlang : errors and processes

learn you some erlang : supervisors