En la parte 1 creamos nuestro programa del clima. En la parte 2 ya hicimos que nuestro programa fuera concurrente. Ahora vamos a modificar nuestro programa para que un actor pueda recolectar los datos y poder manipularlos con Elixir, ya que mandarlos a la shell no nos sirve de mucho.

El actor que vamos a crear debe saber cuántos mensajes son los esperados. En otras palabras, este actor va a guardar el estado.

Para entenderle mejor, crearemos un archivo en lib/coordinator.ex

Primeramente, en nuestro coordinador agregamos un loop que va a estar escuchando y va a poder recibir como mensaje una tupla con un atom y los resultados de nuestro worker, también va a poder recibir un atom :exit  en en cual va a poner los resultados, los va a ordenar y los va a unir en una cadena para poder leerlos.

Si llega algún otro mensaje, entonces simplemente va a correr el loop de nuevo.

Vamos a ver más de cerca nuestro loop que recibe la tupla, ya que es lo que hace que nuestro coordinador vaya recibiendo los resultados.

Este segmento de código lo que hace es estar recibiendo los resultados del worker y agregarlo a la lista, cuando no hay más resultados entonces se sale.

Listo, ahora solo nos falta usar a nuestro coordinador junto al worker. Escribamos esto en nuestro archivo lib/elixir_weather.ex.

Es un código no tan complicado, creamos el proceso del coordinador que va a estar escuchando cada vez que un proceso de un worker le mande un mensaje.

Cuando hacemos esto send(worker_pid, {coordinator_pid, city}) , mandamos un mensaje al worker, pero con el pid del coordinador, si recuerdas, este es el mensaje que esta escuchando el worker

Ahora es tiempo de usar nuestro programa, iex -S mix

Como vez, obtuvimos los resultados esperados, de una forma más rápida porque los procesos fueron concurrentes, y también ordenados alfabeticamente gracias a nuestro coordinador.

¡Felicidades! Has creaeado tu primer programa concurrente en Elixir y has usado uno de las características más importantes de Erlang y Elixir.

Si tienes alguna duda puedes escribirlo aquí o mandarme un mensaje en Twitter. El repositorio de este proyecto está en Github

%d bloggers like this: