Ich habe Arbeitsprozesse, die beim Starten gesammelte/berechnete Daten als Argumente benötigen. Diese werden dann auch bei Neustarts benötigt. Wo sollte ich den Initialisierungscode unterbringen? Innerhalb des Supervisors init? Oder in den Modulen start_link oder init? Gibt es in Erlang irgendwelche Best Practices, wenn es um dieses Thema geht?
Antwort
Zu viele Anzeigen?Wenn die Komponente gen_server einen kritischen Zustand hat oder einen Zustand, der nicht neu berechnet/gesammelt werden kann, vermeide ich es im Allgemeinen, den Zustand in gen_server selbst zu speichern. Ich entscheide mich stattdessen dafür, den Status in einer externen Prozess-/Etz-Tabelle zu speichern. Wenn Sie sich für diesen Ansatz entscheiden, stellen Sie sicher, dass die ets-Tabelle entweder von einem externen Prozess erstellt wird (von dem Sie sicher sind, dass er nicht stirbt), z. B. dem Anwendungsprozess, oder erstellen Sie die ets-Tabelle in der init-Methode des gen_server und verwenden Sie die "ets:give_away/3"-Methode, um sie an einen externen Prozess zu übergeben (natürlich müssen Sie prüfen, ob die Tabelle bereits in der init-Methode des gen_server erstellt wurde). Andernfalls wird die ets-Tabelle zerstört, wenn der Prozess stirbt