Programación en Erlang/Registrando el nombre de procesos
En el ejemplo anterior, primero se creo "pong" para poder darle la identidad de “pong” a “ping” al ser iniciada. En otras palabras, “ping" debe saber la identidad de “pong” para poder enviarle algún mensaje. Algunas veces los procesos que necesitan saber la identidad de otros son iniciados completamente independientes uno del otro. Erlang provee mecanismos para dale nombres a los procesos y así utilizar estos nombres como identidades en vez de los pids. Esto se hace utilizando la BIF register: register(some_atom, Pid)
Ahora, si reescribimos el ejemplo de Ping-Pong utilizando esto y dandole el nombre pong al proceso "pong": -module(tut16).
-export([start/0, ping/1, pong/0]).
ping(0) ->
pong ! finished, io:format("ping finished~n", []);
ping(N) ->
pong ! {ping, self()}, receive pong -> io:format("Ping received pong~n", []) end, ping(N - 1).
pong() ->
receive finished -> io:format("Pong finished~n", []); {ping, Ping_PID} -> io:format("Pong received ping~n", []), Ping_PID ! pong, pong() end.
start() ->
register(pong, spawn(tut16, pong, [])), spawn(tut16, ping, [3]).
2> c(tut16). {ok, tut16} 3> tut16:start(). <0.38.0> Pong received ping Ping received pong Pong received ping Ping received pong Pong received ping Ping received pong ping finished Pong finished
En la función start/0, register(pong, spawn(tut16, pong, [])),
ambos generan el proceso “pong” y les da el nombre pong. En el proceso “ping”, ahora, se puede enviar mensajes a pong de esta manera: pong ! {ping, self()},
y así ping/2 ahora se convierte en ping/1 ya que, no debemos utilizar el argumento Pong_PID.