如果孩子退出,让主管死

Dav*_*ogt 1 erlang erlang-otp

(注意:我还在学习,因此以下可能是一个完全愚蠢的架构)

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

现在当然,当客户端套接字关闭时,所有四个(主管、多路复用器、读取器、写入器)都应该退出,因为它们没有意义。当套接字关闭和退出时,读写器会注意到,但主管仍然在附近徘徊。

如何设置主管以便发生这种情况?

leg*_*cia 5

您可以将监督者的“最大重启频率”设置为零,这意味着监督者将在其任何子级崩溃时崩溃。init主管模块的功能如下所示:

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

    Flags = #{intensity => 0},
    {ok, {Flags, [Multiplexer, Reader, Writer]}}.
Run Code Online (Sandbox Code Playgroud)

对于这种情况,当主管监督紧密耦合且应该一起重新启动的进程时,您通常会使用one_for_all重新启动策略,但在这里这并不重要,因为您只想让整个事情崩溃。

  • 非常感谢!我将读取器/写入器设置为重新启动 => 临时,这似乎可以防止主管在这些孩子退出时(出于任何原因)崩溃。现在我已经设置了重启 => 瞬态,现在似乎可以工作了。 (4认同)