Anillo de Mensajes en Erlang

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!

2 respuestas a Anillo de Mensajes en Erlang

  1. Pedro dice:

    ¿Has mirado Scala? ¿Que opinas de Scala?

    Últimamente oigo mucho el debate Clojure vs Scala. Scala es multiparadigma y uno de sus paradigmas es la programación funcional.

    Supongo que lo conoces, si no han cambiado, es lo que usan en Foursquare (Scala/Lift)

    • robjperez dice:

      Hola Pedro,

      Ultimamente parece haber mucho revuelo alrededor de los lenguajes funcionales como, Scala, Clojure, Erlang, F#…

      Sin duda, una de las cosas buenas que aportan es lo bien que se adaptan a entornos multihilo o multiprocesador, cosas como la inmutabilidad de los datos son muy utiles a la hora de tratar las cosas en estos entornos.

      Sin embargo, habiendo visto un poquito de Scala o Erlang creo que el punto de entrada es complejo, quizás Scala no tanto, pero sobre todo Erlang o Clojure te exigen cambiar la forma en que programas y la forma en como planteas una solución a un problema, y eso no es sencillo.

      Particularmente creo que aportan cosas interesantes (como el modelo de actores de Scala o el concepto de procesos y mensajes de Erlang), y que se harán un hueco entre los habituales Java, c# o Ruby para Web.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: