2014-11-19 4 views
11

Ich bin mir nicht ganz sicher, die Unterschiede zwischen der PID und Reference und wann zu welcher verwenden.Referenz vs Pid?

Wenn ich einen neuen Prozess mit spawn/1 pid spawn würde. Ich kann es mit der PID töten, nein? Warum brauche ich eine Referenz?

Ebenso sehe ich monitor/1 Empfangen einer Nachricht mit einem Ref und PID-Nummer.

Danke!

Antwort

23

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.

3

Nach this page:

Referenzen sind erlang Objekte mit genau zwei Eigenschaften:

They can be created by a program (using make_ref/0), and, 
They can be compared for equality. 

Sie es verwenden, sollten Sie jemals eine eindeutige Kennung zu einem gewissen "Objekt" binden müssen. Jedes Mal, wenn Sie ein neues generieren konnten, verwenden Sie erlang:make_ref/0. Documentation sagt:

make_ref() -> Referenz()

eine nahezu eindeutige Referenz zurück.

Die zurückgegebene Referenz wird nach etwa 2^82 Aufrufen erneut angezeigt. daher ist es einzigartig genug für praktische Zwecke.

Wenn Sie erlang:monitor/2 Funktion aufrufen, gibt sie Sie verweisen Sie die Verfügbarkeit geben Monitor abzubrechen (erlang:demonitor/1-Funktion). Diese Referenz identifiziert nur bestimmte Aufrufe von erlang:monitor/1. Wenn Sie mit einem Prozess arbeiten müssen (zum Beispiel "kill it"), müssen Sie immer noch den Prozess pid verwenden.

Ebenso sehe ich/1 überwachen, um eine Nachricht mit einer ref und pid-Nummer erhalten.

Yep, sendet Monitor Nachrichten wie { 'DOWN', Ref, Prozess, Pid, ​​Reason}. Was zu verwenden ist (pid oder ref) hängt nur von Ihrer Anwendungslogik ab, aber (IMO) ist in den meisten Fällen egal, was zu verwenden ist.