我有这样的结构
-------------
|Supervisor |
-------------
|
-------------
| Child1 |
-------------
|
-------------
| Child2 |
-------------
在这个结构中,child1受到监督,它产生了child2。我需要的是能够在child2崩溃/退出时重启child1。哪个是实现这个目标的最佳方法?
答案 0 :(得分:1)
如果Child1
在Child2
崩溃时允许Child1
崩溃,那么您现有的主管就会崩溃
只需重新启动Child2
,即可重新启动Child1
。
但是当Child2
崩溃时,这取决于Change this: Into this:
+------------+ +------------+
| Supervisor | | Supervisor |
+------------+ +------------+
| |
+------------+ +------------+
| Child1 | New supervisor ---> | Supervisor |
+------------+ +------------+
| | |
+------------+ +------------+ +---------+
| Child2 | | Child1 | | Child2 |
+------------+ +------------+ +---------+
| |
other service other service
崩溃。另外一个选项
是在进程树中插入另一个主管:
{{1}}
新主管只处理两个孩子作为他们自己的服务,允许 任何一方的死亡都以可配置的方式影响另一方。
答案 1 :(得分:0)
查看Erlang文档:http://www.erlang.org/doc/design_principles/sup_princ.html
您所要做的就是重新安排流程树并使用one_for_all
重启策略。在我的意见中,Child1和Child2应该是主管的孩子。
或者,如果你想保留像他们那样的东西,你必须在进程Child1中捕获进程Child2的EXIT。当EXIT到达Child1时,所有Child1都必须返回:
{stop, normal, State}
并且它将由Supervisor重新启动。主管必须处于permanent
重启模式。