Pregunta

¿Alguien puede explicar la estructura de un Pid en Erlang?

Pids tiene este aspecto: <A.B.C> , p. < 0.30.0 > , pero me gustaría saber cuál es el significado de estos tres & "; bits &"; : A, B y C.

'A' parece ser siempre 0 en un nodo local, pero este valor cambia cuando el propietario del Pid se encuentra en otro nodo.

¿Es posible enviar un mensaje directamente en un nodo remoto usando solo el Pid? Algo así: & Lt; 4568.30.0 & Gt; ! Mensaje, sin tener que especificar explícitamente el nombre del proceso registrado y el nombre del nodo ({proc_name, Node}! Message)?

¿Fue útil?

Solución

ID de proceso impreso < A.B.C & Gt; están compuestos de 6 :

  • A, el número de nodo (0 es el local nodo, un número arbitrario para un nodo remoto)
  • B, los primeros 15 bits del número de proceso (un índice en la tabla de proceso) 7
  • C, bits 16-18 del número de proceso (el mismo número de proceso que B) 7

Internamente, el número de proceso tiene 28 bits de ancho en el emulador de 32 bits. La definición extraña de B y C proviene de R9B y versiones anteriores de Erlang en las que B era un ID de proceso de 15 bits y C era un contador de ajuste incrementado cuando se alcanzaba el ID de proceso máximo y se reutilizaban ID más bajos.

En la distribución erlang, los PID son un poco más grandes, ya que incluyen el átomo de nodo y la otra información. ( formato PID distribuido )

Cuando se envía un PID interno de un nodo a otro, se convierte automáticamente al formulario PID externo / distribuido, por lo que lo que podría ser <0.10.0> (inet_db) en un nodo podría terminar como <2265.10.0> cuando enviado a otro nodo. Simplemente puede enviar a estos PID de forma normal.

% 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()]). 

Para obtener más información, consulte: No= información de creación , No = información de creación , No = información de creación>> Interacción del contador de creación de nodos con EPMD

Otros consejos

Si recuerdo esto correctamente, el formato es <nodeid,serial,creation>. 0 es el nodo actual al igual que una computadora siempre tiene el nombre de host & Quot; localhost & Quot; para referirse a sí mismo. Esto es de memoria antigua, por lo que podría no ser 100% correcto.

Pero sí. Puede construir el pid con list_to_pid/1 por ejemplo.

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

Por supuesto. Simplemente usa cualquier método que necesites usar para construir tu PidString. Probablemente escriba una función que la genere y úsela en lugar de PidString como tal:

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

Id. de proceso < A.B.C & Gt; se compone de:

  • A, id de nodo que no es arbitrario sino el índice interno para ese nodo en dist_entry. (En realidad, es el entero de la ranura del átomo para el nombre del nodo).
  • B, índice de proceso que se refiere al índice interno en el proctab, (0 - > MAXPROCS).
  • C, Serie que aumenta cada vez que se alcanza MAXPROCS.

La etiqueta de creación de 2 bits no se muestra en el pid pero se usa internamente y aumenta cada vez que el nodo se reinicia.

El PID se refiere a un proceso y una tabla de nodos. Por lo tanto, solo puede enviar un mensaje directamente a un PID si se conoce en el nodo desde el que realiza la llamada.

Es posible que esto funcione si el nodo desde el que realiza la llamada ya sabe sobre el nodo en el que se ejecuta el proceso.

Además de lo que otros han dicho, este simple experimento puede resultarle útil para comprender lo que está sucediendo internamente:

1> node().
nonode@nohost
2> term_to_binary(node()).
<<131,100,0,13,110,111,110,111,100,101,64,110,111,104,111,
  115,116>>
3> self().                
<0.32.0>
4> term_to_binary(self()).
<<131,103,100,0,13,110,111,110,111,100,101,64,110,111,104,
  111,115,116,0,0,0,32,0,0,0,0,0>>

Entonces, puede ver que el nombre del nodo está almacenado internamente en el pid. Más información en esta sección de Learn You Some Erlang.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top