PID ist Prozesskennung. Sie können einen erhalten, wenn Sie einen neuen Prozess mit spawn
erstellen, oder Sie können Pid von sich selbst mit self()
bekommen. Es ermöglicht Ihnen, mit dem gegebenen Prozess zu interagieren. Senden Sie besonders Nachrichten an es durch Pid ! Message
. Und einige andere Dinge, wie zum Beispiel das explizite Töten (sollte es nicht tun) oder das Erhalten einiger Prozessinformationen mit erlang:process_info
.
Und Sie können Beziehungen zwischen Prozess mit erlang:link(Pid)
und erlang:monitor(process, Pid)
erstellen (das ist zwischen Pid
Prozess, und Prozessausführung diese Funktion). Kurz gesagt, es gibt Ihnen "Benachrichtigungen", wenn ein anderer Prozess stirbt.
Referenz ist nur almost unique Wert (von anderem Typ). Man könnte sagen, dass es Ihnen hier und jetzt einen Bezug gibt, den Sie später erkennen konnten.Wenn wir beispielsweise eine Nachricht an einen anderen Prozess senden und wir eine Antwort erwarten, möchten wir sicherstellen, dass die Nachricht, die wir erhalten, mit unserer Anfrage verknüpft ist und nicht nur mit einer Nachricht von jemand anderem. Am einfachsten ist es, die Nachricht mit einem eindeutigen Wert zu versehen und auf eine Antwort mit genau demselben Tag zu warten.
Tag = make_ref(),
Pid ! {Tag, Message},
receive
{Tag, Response} ->
....
In diesem Code unter Verwendung von Pattern-Matching, stellen wir sicher, dass (wir erhalten, bis warten) Response
genau für die Message
ist, dass wir geschickt. Ganz gleich, ob andere Nachrichten von anderen Prozessen stammen. Dies ist die häufigste Verwendung der Referenz, auf die Sie stoßen können.
Und jetzt zurück zu monitor
. Beim Aufruf Ref = monitor(process, Pid)
machen wir diese spezielle Verbindung mit Pid
Prozess. Ref
das zurückgegeben wird, ist nur eine eindeutige Referenz, die wir verwenden könnten, demonitor
diesen Prozess. Das ist alles.
Man könnte nur fragen, ob wir Monitor mit Pid
erstellen können, warum brauchen wir Ref
für das Dämonitoring? Könnten wir nicht einfach Pid
wieder verwenden? Theoretisch könnten wir das, aber Monitore werden so implementiert, dass mehrere Monitore zwischen zwei gleichen Prozessen aufgebaut werden können. Beim Dämonisieren müssen wir also nur eine dieser Verbindungen entfernen. Auf diese Weise wird das Monitoring transparenter. Wenn Sie eine Bibliothek mit Funktionen haben, die einen Monitor erstellen und entfernen, möchten Sie andere Bibliotheken und Funktionen und Monitore, die sie möglicherweise verwenden, nicht stören.