Anillo de Mensajes en Erlang

diciembre 24, 2010

Desde hace algún tiempo, llevo investigando el mundo de la programación funcional. Después de probar varios lenguajes como F#, o Clojure, finalmente me decanté por Erlang.

La verdad es que estoy pasandomelo bien recordando los viejos tiempos de Lisp o Prolog :), y sobre todo aprendiendo una forma diferente de afrontar los problemas.

Para el aprendizaje, mi libro de cabecera es Programming Erlang de la editorial Pragmatic Bookshelf. Libro que me esta gustando bastante, ya que asume que no tienes ni idea de programación funcional, como era mi caso.

Quizás para otro post os pueda contar algo de los beneficios que tiene la programación funcional, como por ejemplo, lo bien que escalan en entornos multiprocesador y lo robustos que son para entornos multihilo, gracias a la eliminación de los “side-effects”.

En dicho libro se plantea un ejercio en el que se pide que se cree un “anillo” de M procesos, de tal manera que enviando un mensaje a uno de esos procesos, dicho mensaje circule por el anillo N veces.

Una vez que se tiene la estructura, se pide que se mida el tiempo que tarda en circular los M*N mensajes, se compare con lo mismo hecho en otro lenguaje de programación (preferiblemente no funcional) y después que se publique en un blog.

Así que obediente de mi, aqui os dejo la primera parte, el ejercicio hecho en Erlang. Para otra entrada dejo la comparación con lo mismo hecho en otro lenguaje 🙂

-module(ring).
-export([ringtest/2, ringNode/1]).

ringNode(PPid) ->
	receive
		{exit} ->
			PPid!{exit},
			true;
		{0} ->
			PPid!{exit},
			true;
		{N} ->
			PPid!{(N-1)},
			ringNode(PPid)
	end.

ringtest(N, M) ->
	ringtest(N-2, self(), N*(M-1)).

ringtest(0, ThisPid, M) ->
	Pid = spawn(ring, ringNode, [ThisPid]),
	Pid!{M},
	ringNode(Pid);
ringtest(N, ThisPid, M) ->
	Pid = spawn(ring, ringNode, [ThisPid]),
	ringtest(N-1, Pid, M).

Analizando los tiempos (que están en microsegundos), lo cierto es que erlang es bastante rápido, tanto en crear procesos como en enviar mensajes entre ellos. El ordenador que ejecuto el programa era un ATOM D525 de 1.8Ghz y en crear 5000 procesos, y enviar el mensaje 100 veces alrededor del anillo, sólo tardó 1,2 segundos. Sin duda, una cifra bastante interesante.

Despueés de ver estos números, esta claro que no es casulidad que sea una de las plataformas preferidas a la hora de desarrollar aplicaciones que se muevan en estos tipos de entornos.

No soy ningun experto de Erlang, de hecho aun estoy aprendiendo, así que alguien lo lee y tiene algún comentario, serán bienvenidos!