Erlang 如果孩子退出,让一个主管去死

Erlang 如果孩子退出,让一个主管去死,erlang,otp,Erlang,Otp,注意:我仍在学习,因此下面的架构可能是一个完全愚蠢的架构 我正在Erlang中构建一个简单的TCP服务器。我有一个层次结构,它为每个对等连接启动一个监控器,该监控器依次监控多路复用器、套接字读取器和套接字编写器 当然,当客户端套接字关闭时,所有四个监管者、多路复用器、读卡器、写卡器都应该退出,因为他们留在这里是没有意义的。读写器确实会注意到插座何时关闭和退出,但监管者仍然在附近徘徊 如何设置管理器以实现此目的?您可以将管理器的最大重新启动频率设置为零,这意味着如果其任何子系统崩溃,管理器将崩溃。

注意:我仍在学习,因此下面的架构可能是一个完全愚蠢的架构

我正在Erlang中构建一个简单的TCP服务器。我有一个层次结构,它为每个对等连接启动一个监控器,该监控器依次监控多路复用器、套接字读取器和套接字编写器

当然,当客户端套接字关闭时,所有四个监管者、多路复用器、读卡器、写卡器都应该退出,因为他们留在这里是没有意义的。读写器确实会注意到插座何时关闭和退出,但监管者仍然在附近徘徊


如何设置管理器以实现此目的?

您可以将管理器的最大重新启动频率设置为零,这意味着如果其任何子系统崩溃,管理器将崩溃。supervisor模块的init函数如下所示:

init(Args) ->
    Multiplexer = #{id => multiplexer, start => ...},
    Reader = #{id => reader, start => ...},
    Writer = #{id => writer, start => ...},

    Flags = #{intensity => 0},
    {ok, {Flags, [Multiplexer, Reader, Writer]}}.

在这种情况下,当一个主管管理紧密耦合且应该一起重新启动的进程时,您通常会使用“一对多”重新启动策略,但在这里这并不重要,因为您只希望整个进程崩溃。

您可以将主管的最大重新启动频率设置为零,这意味着,如果其任何子系统崩溃,主管将崩溃。supervisor模块的init函数如下所示:

init(Args) ->
    Multiplexer = #{id => multiplexer, start => ...},
    Reader = #{id => reader, start => ...},
    Writer = #{id => writer, start => ...},

    Flags = #{intensity => 0},
    {ok, {Flags, [Multiplexer, Reader, Writer]}}.

在这种情况下,当主管管理紧密耦合且应一起重新启动的流程时,通常您会使用“一对一”重新启动策略,但在这里这并不重要,因为您只希望整个流程崩溃。

非常感谢!我将读写器设置为restart=>temporary,这似乎可以防止那些孩子出于任何原因退出时监管者崩溃。现在我已经设置了restart=>transient,它现在似乎可以工作了。非常感谢!我将读写器设置为restart=>temporary,这似乎可以防止那些孩子出于任何原因退出时监管者崩溃。现在我已经设置了restart=>transient,它现在似乎可以工作了。