2014-11-19 12 views
11

Non sono completamente sicuro delle differenze tra PID e Riferimento e quando utilizzare quale.Riferimento vs pid?

Se dovessi generare un nuovo processo con il pid spawn/1. Posso ucciderlo con il PID no? Perché dovrei avere bisogno di un riferimento?

Allo stesso modo, vedo monitor/1 ricevere un messaggio con un numero di riferimento e pid.

Grazie!

risposta

23

Pid è un identificativo di processo. Puoi ottenerne uno quando crei un nuovo processo con spawn oppure puoi ottenere Pid di te stesso con self(). Ti consente di interagire con un determinato processo. In particolare, invia messaggi al numero Pid ! Message. E alcune altre cose, come ucciderlo esplicitamente (non dovrebbe fare) o ottenere alcune informazioni di processo con erlang:process_info.

E è possibile creare relazioni tra il processo con erlang:link(Pid) e erlang:monitor(process, Pid) (compreso tra il processo Pid ed elaborare l'esecuzione di questa funzione). In breve, ti dà "notifiche" quando un altro processo muore.

Riferimento è solo almost unique valore (di tipo diverso). Si potrebbe dire che ti dà qualche riferimento a qui e ora, che potresti riconoscere in seguito.Ad esempio, se inviamo un messaggio a un altro processo e ci aspettiamo una risposta, vorremmo assicurarci che il messaggio che riceveremo sia associato alla nostra richiesta e non solo a qualsiasi altro messaggio di qualcun altro. Il modo più semplice per farlo è taggare il messaggio con un valore univoco e attendere una risposta con esattamente lo stesso tag.

Tag = make_ref(), 
    Pid ! {Tag, Message}, 
    receive 
    {Tag, Response} -> 
     .... 

In questo codice, con l'uso di pattern matching, ci assicuriamo che (aspettiamo in riceviamo fino) Response è esattamente per la Message abbiamo inviato. Non importa altri messaggi da altri processi. Questo è l'uso di riferimento più comune che puoi incontrare.

E ora di nuovo a monitor. Quando si chiama Ref = monitor(process, Pid) facciamo questa connessione speciale con il processo Pid. Ref che viene restituito è solo qualche referenza univoco, che potremmo utilizzare per il processo demonitor. Questo è tutto.

Si potrebbe solo chiedere, se siamo in grado di creare monitor con Pid, perché abbiamo bisogno di Ref per il demonitoraggio? Non potremmo usare solo Pid di nuovo. In teoria potremmo, ma i monitor sono implementati in questo modo, che è possibile stabilire più monitor tra due processi identici. Quindi, quando demonitoriamo, dobbiamo rimuovere solo una di queste connessioni. È fatto in questo modo per rendere il monitoraggio più trasparente. Se si dispone di una libreria di funzioni che crea e rimuove un monitor, non si desidera interferire con altre librerie e funzioni e monitor che potrebbero utilizzare.

3

Secondo this page:

I riferimenti sono oggetti Erlang con esattamente due proprietà:

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

si dovrebbe usare mai è necessario associare un identificatore univoco per un po ' "oggetto". Ogni volta che è possibile generarne uno nuovo usando erlang:make_ref/0. Documentation dice:

make_ref() -> di riferimento()

Restituisce un riferimento quasi unico.

Il riferimento restituito si ripresenterà dopo circa 2^82 chiamate; quindi è abbastanza unico per scopi pratici.

Quando si chiama erlang:monitor/2 funzione, restituisce si fa riferimento per darvi la disponibilità di annullare monitor (erlang:demonitor/1 funzione). Questo riferimento identifica solo determinate chiamate di erlang:monitor/1. Se hai bisogno di operare con il processo (uccidilo, per esempio), devi ancora usare process pid.

Allo stesso modo non vedo monitorare/1 la ricezione di un messaggio con un ref e numero PID.

Yep, Monitor invia messaggi come { 'GIU', Ref, processo, Pid, ​​Reason}. Cosa usare (pid o ref) dipende solo dalla logica della tua applicazione, ma (IMO) nei casi più comuni, non importa cosa usare.