2016-05-12 6 views
1

終了した場合、スーパーバイザが死ぬましょう:子供が

私はErlangで、単純なTCPサーバを構築しています(注を完全に愚かなアーキテクチャを私はまだ学んでいるし、次は、このようにすることができます)。私は、各ピア接続のスーパーバイザを起動する階層を持っています。それはマルチプレクサ、ソケットリーダー、ソケットライターを監督します。

もちろん、クライアントソケットが閉じると、4人(スーパーバイザー、マルチプレクサ、リーダー、ライター)のすべてが終了する必要があります。リーダ/ライタは、ソケットが閉じて終了するときに注意しますが、スーパーバイザはまだハングアップします。

これが起こるようにスーパーバイザを設定するにはどうすればよいですか?

答えて

5

スーパーバイザの「最大再起動回数」を0に設定できます。これは、子がクラッシュした場合にスーパーバイザがクラッシュすることを意味します。スーパーバイザが密結合されていると一緒に再起動する必要があるプロセスを監督するとき、あなたは通常one_for_all再起動戦略を使用したい、このような場合のために

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

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

:スーパーバイザモジュールのinit機能は、次のようになりますしかし、ここでは問題はありません。なぜなら、あなたは全体がクラッシュするだけだからです。

+3

ありがとうございました!私はリーダー/ライターを再起動するように設定しました。>一時的なものです。これは、何らかの理由でスーパーバイザーがクラッシュするのを防ぐためです。今私はrestart => transientを設定しました。これは今動作するようです。 –