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.