Erlang 监视重新启动进程的子进程
我有一个这样的结构Erlang 监视重新启动进程的子进程,erlang,behavior,spawn,erlang-supervisor,Erlang,Behavior,Spawn,Erlang Supervisor,我有一个这样的结构 ------------- |Supervisor | ------------- | ------------- | Child1 | ------------- | ------------- | Child2 | ------------- 在这个结构中,child1受到监督,并生成child2。我需要的是在child2崩溃/退出时能够重新启动child1。实现这一目标的最佳方式是什么 查看Erlang文档: 您所要做的就是重新排列
-------------
|Supervisor |
-------------
|
-------------
| Child1 |
-------------
|
-------------
| Child2 |
-------------
在这个结构中,child1受到监督,并生成child2。我需要的是在child2崩溃/退出时能够重新启动child1。实现这一目标的最佳方式是什么 查看Erlang文档: 您所要做的就是重新排列进程树,并使用“一对一”重启策略。在我看来,孩子1和孩子2应该是主管的孩子 或者,如果您想保持当前的状态,您必须在进程Child1中捕获进程Child2的退出。当Child1退出时,所有Child1必须返回:
{stop, normal, State}
并由主管自动重新启动。主管必须处于
永久
重新启动模式。如果在Child2
崩溃时允许Child1
崩溃,则现有主管
只需重新启动Child1
,即可重新启动Child2
但这取决于Child1
在Child2
崩溃时崩溃。另一种选择
是在流程树中插入另一个主管:
Change this: Into this:
+------------+ +------------+
| Supervisor | | Supervisor |
+------------+ +------------+
| |
+------------+ +------------+
| Child1 | New supervisor ---> | Supervisor |
+------------+ +------------+
| | |
+------------+ +------------+ +---------+
| Child2 | | Child1 | | Child2 |
+------------+ +------------+ +---------+
| |
other service other service
新的主管只处理两个孩子,作为他们自己的服务,允许
任何一方的死亡都会以可配置的方式影响另一方。如果您允许
Child1
在Child2
崩溃时崩溃,您的主管只需重新启动它即可。你的主管为什么不自己启动这两个过程,有没有令人信服的原因?不要捕捉来自Child2的退出信号。Child1应该是常规流程,而不是系统流程。这样,当Child2终止时,Child1也会终止,并且主管会重新启动Child1,这会启动Child2。@sarnold是的,有。Child1启动Child2启动服务完成后感谢您的回答,我只是使用spawn_链接启动Child2,如果Child2崩溃,让它们都崩溃。@sarnold如果您将您的评论重新格式化为答案,我可以接受它并关闭问题。