【问题标题】:Let a supervisor die if a child exits如果孩子离开,让主管死
【发布时间】:2016-05-12 18:30:38
【问题描述】:

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

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

当然,当客户端套接字关闭时,所有四个(主管、多路复用器、读取器、写入器)都应该退出,因为它们留在周围没有意义。当套接字关闭和退出时,读写器会记录下来,但主管仍然会挂起。

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

【问题讨论】:

    标签: erlang erlang-otp


    【解决方案1】:

    您可以将 supervisor 的“最大重启频率”设置为零,这意味着如果它的任何子节点崩溃,supervisor 就会崩溃。主管模块的init 函数看起来像这样:

    init(Args) ->
        Multiplexer = #{id => multiplexer, start => ...},
        Reader = #{id => reader, start => ...},
        Writer = #{id => writer, start => ...},
    
        Flags = #{intensity => 0},
        {ok, {Flags, [Multiplexer, Reader, Writer]}}.
    

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

    【讨论】:

    • 非常感谢!我将读取器/写入器设置为重新启动 => 临时,这似乎可以防止主管在这些孩子退出时崩溃(出于任何原因)。现在我设置了重启 => 瞬态,现在似乎可以工作了。
    猜你喜欢
    • 2016-06-11
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2017-05-02
    相关资源
    最近更新 更多