Elixirs Mix and OTP Guide Chapter GenServer erläutert, wie Sie einen Registrierungsserver implementieren, der Agenten unter Verwendung von GenServer
verwendet.Warum sollte bei der Implementierung eines GenServers besser auf #Referenz als auf #PID geachtet werden?
Die PID jedes Agenten wird in einer Zuordnung gespeichert, wobei die Schlüssel die von den Clients angegebenen Agentennamen sind und die Werte die PIDs des Agenten sind.
Um zu vermeiden, Hinweise auf tote Agenten zu halten, schlägt die Führung neu erstellten Agenten Überwachung Process.monitor/1
mit und leicht den Zustand zu modifizieren, indem eine neue Karte hinzufügen, genannt refs
, enthalten Verweise (Werte zurückgegeben durch Process.monitor/1
) als Schlüssel und Agenten Namen als Werte. Es zeigt auch, wie mit Überwachungsnachrichten unter Verwendung von handle_info/2
zum Aktualisieren refs
umzugehen.
Process.monitor/1
empfängt eine PID (z. B. #PID<0.66.0>
) als Parameter und gibt eine Referenz zurück (z. B. #Reference<0.0.0.551>
). Die :DOWN
Nachricht, die von handle_info/2
abgefangen wird, stellt sowohl die PID als auch die Referenz bereit.
Da wir die ganze Zeit beide Werte kennen: Was sind die Vorteile der Verwendung von Referenzen als Schlüssel über die Verwendung von PIDs in refs
, falls vorhanden?