0

我有这样的结构

-------------
|Supervisor |
-------------
      |
-------------
|  Child1   |
-------------
      |
-------------
|  Child2   |
-------------

在这个结构中,child1 受到监督并产生 child2。我需要的是能够在 child2 崩溃/退出时重新启动 child1。实现这一目标的最佳方法是什么?

4

2 回答 2

1

如果您允许Child1在崩溃时Child2崩溃,您现有的主管将简单地重新启动Child1,从而也重新启动Child2

但这取决于Child1崩溃时的Child2崩溃。另一种选择是在流程树中插入另一个主管:

Change this:                          Into this:

+------------+                      +------------+
| Supervisor |                      | Supervisor |
+------------+                      +------------+
      |                                   |
+------------+                      +------------+
|   Child1   |  New supervisor ---> | Supervisor |
+------------+                      +------------+
      |                               |      |
+------------+              +------------+ +---------+
|   Child2   |              |   Child1   | |  Child2 |
+------------+              +------------+ +---------+
      |                                        |
 other service                            other service

新的主管只处理两个孩子作为他们自己的服务,允许任何一个的死亡以可配置的方式影响另一个。

于 2011-10-26T00:28:17.743 回答
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}

它将由主管自动重新启动。主管必须处于permanent重新启动模式。

于 2011-10-25T19:52:16.460 回答