我有这样的结构
-------------
|Supervisor |
-------------
|
-------------
| Child1 |
-------------
|
-------------
| Child2 |
-------------
在这个结构中,child1 受到监督并产生 child2。我需要的是能够在 child2 崩溃/退出时重新启动 child1。实现这一目标的最佳方法是什么?
我有这样的结构
-------------
|Supervisor |
-------------
|
-------------
| Child1 |
-------------
|
-------------
| Child2 |
-------------
在这个结构中,child1 受到监督并产生 child2。我需要的是能够在 child2 崩溃/退出时重新启动 child1。实现这一目标的最佳方法是什么?
如果您允许Child1
在崩溃时Child2
崩溃,您现有的主管将简单地重新启动Child1
,从而也重新启动Child2
。
但这取决于Child1
崩溃时的Child2
崩溃。另一种选择是在流程树中插入另一个主管:
Change this: Into this:
+------------+ +------------+
| Supervisor | | Supervisor |
+------------+ +------------+
| |
+------------+ +------------+
| Child1 | New supervisor ---> | Supervisor |
+------------+ +------------+
| | |
+------------+ +------------+ +---------+
| Child2 | | Child1 | | Child2 |
+------------+ +------------+ +---------+
| |
other service other service
新的主管只处理两个孩子作为他们自己的服务,允许任何一个的死亡以可配置的方式影响另一个。
查看 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}
它将由主管自动重新启动。主管必须处于permanent
重新启动模式。