zombie there erlang

erlang - there - show zombie process linux



Referencia vs pid? (2)

De acuerdo con esta página :

Las referencias son objetos erlang con exactamente dos propiedades:

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

Debe usarlo siempre que necesite vincular un identificador único a algún "objeto". En cualquier momento podrías generar uno nuevo usando erlang:make_ref/0 . La documentación dice:

make_ref () -> referencia ()

Devuelve una referencia casi única.

La referencia devuelta volverá a ocurrir después de aproximadamente 2 ^ 82 llamadas; por lo tanto, es lo suficientemente único para fines prácticos.

Cuando llamas a erlang:monitor/2 función, devuelve tu referencia para darte disponibilidad para cancelar el monitor ( erlang:demonitor/1 función). Esta referencia solo identifica ciertas llamadas de erlang:monitor/1 . Si necesita operar con proceso (matarlo, por ejemplo), todavía tiene que usar el proceso pid.

Del mismo modo veo que monitor / 1 recibe un mensaje con un número ref y pid.

Sí, el monitor envía mensajes como {''DOWN'', Ref, process, Pid, ​​Reason}. Lo que debe usar (pid o ref) solo depende de la lógica de su aplicación, pero (IMO) en la mayoría de los casos habituales, no importa qué usar.

No estoy del todo seguro de las diferencias entre el PID y la referencia y cuándo usar qué.

Si fuera a generar un nuevo proceso con spawn/1 pid. Puedo matarlo con el PID no? ¿Por qué necesitaría una referencia?

Del mismo modo veo que monitor/1 recibe un mensaje con un número ref y pid.

¡Gracias!


Pid es el identificador del proceso. Puedes obtener uno cuando crees un nuevo proceso con spawn , o puedes obtener Pid de ti mismo con self() . Te permite interactuar con un proceso determinado. ¡Especialmente envíale mensajes por Pid ! Message Pid ! Message Y algunas otras cosas, como matarlo explícitamente (no debería hacerlo) u obtener información de proceso con erlang:process_info .

Y puede crear relaciones entre el proceso con erlang:link(Pid) y erlang:monitor(process, Pid) (eso es entre el proceso Pid y la ejecución del proceso de esta función). En resumen, le da "notificaciones" cuando muere otro proceso.

La referencia es solo un valor casi único (de diferente tipo). Se podría decir que le da alguna referencia aquí y ahora, que podría reconocer más adelante. Por ejemplo, si enviamos un mensaje a otro proceso y esperamos una respuesta, nos gustaría asegurarnos de que el mensaje que recibamos esté asociado a nuestra solicitud y no a cualquier mensaje de otra persona. La forma más fácil de hacerlo es etiquetar el mensaje con un valor único y esperar hasta que aparezca una respuesta con exactamente la misma etiqueta.

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

En este código, con el uso de la coincidencia de patrones, nos aseguramos de que (esperemos hasta recibir) la Response es exactamente para el Message que enviamos. No importa otros mensajes de otros procesos. Este es el uso más común de referencia que puede encontrar.

Y ahora vuelve a monitor . Cuando llamamos Ref = monitor(process, Pid) hacemos esta conexión especial con el proceso Pid . Ref que se devuelve es solo un referance único, que podríamos usar para demonitor este proceso. Eso es todo.

Uno podría preguntar, si somos capaces de crear un monitor con Pid , ¿por qué necesitamos Ref para demonizar? ¿No podríamos simplemente usar Pid nuevamente? En teoría, podríamos, pero los monitores se implementan de tal manera, que se podrían establecer múltiples monitores entre dos mismos procesos. Entonces, cuando demonizamos, tenemos que eliminar solo una de esas conexiones. Se hace de esta manera para que el monitoreo sea más transparente. Si tiene una biblioteca de funciones que está creando y eliminando un monitor, no le gustaría interferir con otras bibliotecas, funciones y monitores que pueda estar usando.