2016-05-12 8 views
1

verlässt (Anmerkung: Ich lerne immer noch, und die folgenden können somit eine ganz dumme Architektur sein)ein Supervisor sterben lassen, wenn ein Kind

Ich bin in Erlang einen einfachen TCP-Server aufzubauen. Ich habe eine Hierarchie, die einen Supervisor für jede Peer-Verbindung startet, der wiederum einen Multiplexer, einen Socket-Reader und einen Socket-Writer überwacht.

Nun natürlich, wenn der Client-Socket schließt, sollten alle vier (Supervisor, Mux, Reader, Writer) beenden, da es keinen Sinn für sie macht, um zu bleiben. Der Leser/Schreiber merkt sich, wenn sich der Socket schließt und austritt, aber der Supervisor hängt immer noch herum.

Wie richte ich den Supervisor so ein, dass dies geschieht?

Antwort

5

Sie können die maximale Neustartfrequenz des Supervisors auf Null setzen, was bedeutet, dass der Supervisor abstürzt, wenn eines seiner Kinder abstürzt. Die init Funktion des Supervisor-Modul würde wie folgt aussehen:

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

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

Für Fälle wie diese, wenn ein Supervisor überwacht Prozesse, die eng gekoppelt sind, und sollten gemeinsam neu gestartet werden, Sie in der Regel die one_for_all Neustart Strategie verwenden würde, aber hier ist es egal, da du nur das ganze Ding zum Absturz bringen willst.

+3

Vielen Dank! Ich hatte den Reader/Writer auf Neustart => temporär eingestellt, was den Supervisor daran hindert, abzustürzen, wenn diese Kinder aus irgendeinem Grund austreten. Jetzt habe ich restart => transient eingestellt, was jetzt zu funktionieren scheint. –