76 votes

Quelqu'un peut-il expliquer la structure d'un Pid à Erlang?

Quelqu'un peut m'expliquer la structure d'un Pid en Erlang?

Pids ressemble à ceci : <A.B.C> , par exemple <0.30.0> , mais je voudrais savoir quelle est la signification de ces trois "morceaux" : A, B et C.

"A" semble être toujours à 0 sur un nœud local, mais cette valeur change lorsque le Pid du propriétaire est situé sur un autre nœud.

Est-il possible d'envoyer directement un message sur un nœud distant en utilisant uniquement le Pid ? Quelque chose comme ça : <4568.30.0> ! Message , sans avoir à spécifier explicitement le nom de l'inscrit processus et le nom du nœud ( {proc_name, Nœud} ! Message ) ?

87voto

archaelus Points 5513

Imprimé id de processus < A. B. C > sont composés de 6:

  • Un, le numéro de nœud (0, c'est le local nœud, un nombre arbitraire d'un nœud distant)
  • B, les 15 premiers bits du numéro de processus (un index dans la table de processus) 7
  • C, les bits 16 à 18 du numéro du processus (le même numéro de processus B) 7

En interne, le numéro de processus est de 28 bits de large sur la 32 bits de l'émulateur. L'étrange définition de a, B et C vient de R9B et les versions antérieures d'Erlang dans laquelle B est un 15bit ID de processus et C était un enveloppement au compteur incrémenté lorsque le max ID de processus a été atteint et inférieure de l'IDs ont été réutilisés.

Dans la de distribution d'erlang PIDs sont un peu plus gros car ils comprennent le nœud de l'atome ainsi que les autres informations. (Distribué PID format)

Lorsqu'un interne PID est envoyé à partir d'un nœud à l'autre, il est automatiquement converti en externe/distribué PID forme, de sorte que ce qui pourrait être <0.10.0> (inet_db) sur un nœud peut finir en <2265.10.0> lors de l'envoi vers un autre nœud. Vous pouvez envoyer ces Pid que la normale.

% get the PID of the user server on OtherNode
RemoteUser = rpc:call(OtherNode, erlang,whereis,[user]), 

true = is_pid(RemoteUser),

% send message to remote PID
RemoteUser ! ignore_this, 

% print "Hello from <nodename>\n" on the remote node's console.
io:format(RemoteUser, "Hello from ~p~n", [node()]). 

Pour plus d'informations, voir: Interne PID structure, La création d'un nœud de l'information, La création d'un nœud compteur d'interaction avec EPMD

14voto

Jon Gretar Points 2846

Si je me souviens bien le format est - <nodeid,serial,creation>. 0 est le nœud actuel comme un ordinateur a toujours le nom de l'hôte "localhost" pour se référer à lui-même. C'est par de vieux souvenirs il pourrait ne pas être correcte à 100% rude.

Mais oui. Vous pouvez construire le pid avec des list_to_pid/1 par exemple.

PidString = "<0.39.0>",
list_to_pid(PidString) ! message.

Bien sûr. Il vous suffit d'utiliser quelle que soit la méthode que vous devez utiliser pour construire votre PidString. Probablement écrire une fonction qui le génère et l'utiliser à la place de PidString comme tel:

list_to_pid( make_pid_from_term({proc_name, Node}) ) ! message

8voto

psyeugenic Points 555

Id de processus < A. B. C > est composé de:

  • Une, id du nœud qui n'est pas arbitraire, mais l'intérieur de l'index pour le nœud dans dist_entry. (C'est en fait l'atome logement entier pour le nom de nœud.)
  • B, processus d'index qui renvoie à l'interne de l'index dans le proctab, (0 -> MAXPROCS).
  • C, numéro de Série, ce qui augmente à chaque fois MAXPROCS a été atteint.

La création de la balise de 2 bits n'est pas affiché dans la mip, mais est utilisé en interne et augmente à chaque fois que le nœud redémarre.

3voto

Ruben Points 4459

Le PID fait référence à un processus et à une table de nœuds. Ainsi, vous ne pouvez envoyer un message directement à un PID que s'il est connu dans le noeud à partir duquel vous effectuez l'appel.

Il est possible que cela fonctionne si le nœud d'où vous appelez est déjà au courant du nœud sur lequel le processus est en cours d'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X