Cómo renombrar procesos

Registrar un nombre en un proceso (o un GenServer, o un Supervisor) tiene ventajas frente a dejarlos anónimos en términos de identificarlos. Además, cómo podemos explorar en el observer información sobre procesos (como su nombre, por ejemplo).

Cuando trabajamos con Elixir y OTP, una de las cuestiones fundamentales es cómo identificar y comunicarnos con los procesos que lanzamos. Habitualmente, cuando creamos un proceso con spawn o con un GenServer, obtenemos un PID, que es el identificador único del proceso. Este PID es lo que usamos para enviarle mensajes, pero si lo perdemos, ya no podemos comunicarnos con ese proceso. Esto puede complicar la gestión y la abstracción en nuestras aplicaciones.

Para solucionar esto, en Erlang y Elixir podemos asignar nombres a los procesos, de manera que no dependamos exclusivamente del PID. Esto es similar a cómo en un sistema operativo los procesos tienen nombres reconocibles, como Firefox.exe o Terminal, que nos permiten identificarlos fácilmente y realizar acciones sobre ellos sin necesidad de conocer su identificador interno.

En Elixir, podemos registrar un proceso con un nombre usando la función Process.register/2, que recibe el PID y un átomo que será el nombre del proceso. Por ejemplo, si registramos un proceso con el nombre :calculator, podremos enviarle mensajes usando ese átomo en lugar del PID. La tabla de procesos de OTP mantiene esta asociación, lo que nos permite abstraernos de los detalles del PID y comunicarnos con procesos mediante nombres globales controlados.

Además, los átomos en Elixir pueden tener una estructura jerárquica, usando puntos para separar niveles, como :calculator.proc. Esto es muy útil porque muchas librerías nos piden que registremos procesos con nombres que sigan esta convención, facilitando la organización y la claridad en la comunicación entre procesos. Por ejemplo, una librería de base de datos podría pedirnos que registremos un proceso con un nombre como :my_app.repo, y luego podremos enviarle mensajes usando ese nombre.

Esta práctica es especialmente común con GenServers. Cuando definimos un GenServer, es habitual que su función start_link acepte una opción name para registrar el proceso con un nombre específico. Así, en lugar de manejar PIDs, podemos interactuar con el GenServer usando su nombre, lo que simplifica mucho el código y mejora la legibilidad. Por ejemplo, podríamos iniciar un GenServer con:

GenServer.start_link(__MODULE__, nil, name: :y_calc_calculator)

Y luego llamar a sus funciones con:

GenServer.call(:y_calc_calculator, {:add, 2, 3})

Esto elimina la necesidad de pasar el PID explícitamente y oculta esos detalles internos, haciendo que la interacción con los procesos sea más limpia y manejable.

Para entender mejor qué procesos están activos y cómo se comunican, podemos usar la herramienta Observer, que forma parte de OTP. Se lanza con :observer.start() y nos muestra una interfaz gráfica similar a un monitor de sistema operativo, donde podemos ver todos los procesos, sus PIDs, nombres, mensajes en cola y otra información relevante. Esto nos ayuda a visualizar el estado de nuestra aplicación y a depurar problemas relacionados con la concurrencia.

Además, Observer permite hacer trazas de procesos, lo que significa que podemos monitorizar la comunicación que recibe un proceso en tiempo real. Esto es muy útil para entender cómo fluyen los mensajes y cómo interactúan los procesos en nuestra aplicación.

En definitiva, nombrar procesos en Elixir y usar herramientas como Observer nos permite manejar la concurrencia de forma más clara y segura, facilitando la comunicación entre procesos y el mantenimiento de nuestras aplicaciones OTP.

Lista de reproducción
  1. 1
    Cómo crear procesos
    11 minutos
  2. 2
    Cómo pasar mensajes entre procesos
    13 minutos
  3. 3
    Diccionario de un proceso y mantener un estado
    15 minutos
  4. 4
    Cómo enlazar procesos para detectar fallos
    13 minutos
  5. 5
    Cómo monitorizar procesos
    10 minutos
  6. 6
    ¿Qué es un GenServer?
    15 minutos
  7. 7
    Cómo enviar mensajes con un GenServer
    19 minutos
  8. 8
    Control de errores y gestión de un GenServer
    19 minutos
  9. 9
    Cómo renombrar procesos
    11 minutos
  10. 10
    Cómo crear un Supervisor Tree
    17 minutos
  11. 11
    Estrategias para trabajar con Supervisor
    18 minutos
  12. 12
    Estrategias para crear un Supervisor
    11 minutos
  13. 13
    Resumen sobre procesos OTP
    12 minutos
  14. 14
    Cómo usar Application
    12 minutos
  15. 15
    Ejemplo de Application con hijos
    14 minutos