Patrones de diseño de aplicaciones: Productor/Consumidor

0
Producer_Consumer_Labview

Visión General
El patrón de diseño Productor/Consumidor está basado en el patrón Maestro/Esclavo y está orientado a mejorar la forma en que se comparte información en múltiples bucles corriendo a velocidades distintas. Así como el patrón estándar Maestro/Esclavo, el patrón Productor/Consumidor se utiliza para separar procesos que producen y consumen datos a velocidades distintas. Los bucles paralelos del patrón Productor/Consumidor se separan en dos categorías; los que producen datos y los que consumen los datos producidos. Las colas de datos (que se cubren con mayor profundidad en la sección del Queued Message Handler) se utilizan para comunicar datos entre bucles del patrón Productor/Consumidor. Estas colas ofrecen la ventaja de almacenar temporalmente los datos entre los bucles productor y consumidor.

El patrón Productor/Consumidor se utiliza comúnmente cuando se adquieren varios conjuntos de datos a ser procesado en orden. Suponga que quiere escribir una aplicación que acepte datos mientras los procesa en el orden en que fueron recibidos. Puesto que encolar (producir) esta información es mucho más fácil que el procesamiento (consumo) en sí, el patrón de diseño Productor/Consumidor es mejor para esta aplicación. Es posible poner ambos productor y consumidor en el mismo bucle para esta aplicación, pero la cola de procesamiento no será capaz de agregar datos adicionales hasta que la primera parte de los datos haya terminado de ser procesada. La propuesta del patrón Productor/Consumidor para esta aplicación sería encolar los datos en el bucle productor y realizar el procesamiento en sí en el bucle consumidor. En efecto, esto le permite al bucle consumidor procesar los datos a su propio ritmo, mientas que permite al bucle productor encolar datos adicionales al mismo tiempo.

Este patrón de diseño se puede utilizar efectivamente cuando se analiza comunicación de red.
Este tipo de aplicación requiere dos procesos simultáneos a diferentes velocidades. El primer proceso constantemente revisa la línea de red y recibe los paquetes. El segundo proceso toma estos paquetes recibidos por el primer proceso y los analiza. En este ejemplo, el primer proceso actúa como productor puesto que provee datos al segundo proceso que actúa como consumidor. Esta aplicación se beneficiaría del uso del patrón de diseño del Productor/Consumidor. Los bucles productor y consumidor paralelos realizan el recibimiento y análisis de los datos de la red y la comunicación por medio de colas entre los dos permite el almacenamiento temporal de los paquetes de red recibidos. Este almacenamiento temporal será muy importante cuando haya un alza en el tráfico de red. Con el almacenamiento temporal, los paquetes se pueden recibir y enviar a ser analizados con mayor rapidez.

Contenido

¿Porqué utilizar Productor/Consumidor?
Construir un Productor/Consumidor
Ejemplo – Move-Window.vi
Notas importantes

1. ¿Porqué utilizar Productor/Consumidor?

El patrón Productor/Consumidor le da la habilidad de gestionar con facilidad múltiples procesos al mismo tiempo que iteran a velocidades distintas. Lo que hace a este patrón único es que agregar el beneficio de la comunicación con memoria intermedia entre los procesos de la aplicación. Cuando estos procesos múltiples iteran a diferente velocidad, la comunicación con memoria intermedia entre procesos es extremadamente efectiva. Por ejemplo, una aplicación tiene dos procesos. El primer proceso realiza adquisición de datos y el segundo proceso toma esos datos y los publica en una red. El primer proceso opera tres veces más rápido que el segundo proceso. Si el patrón de diseño Productor/Consumidor se utiliza para implementar esta aplicación, el proceso de adquisición de datos actuará como productor y el proceso de red como consumidor. Con una cola de comunicación (con memoria intermedia) suficientemente grande, el proceso de red tendrá acceso a una gran cantidad de datos que el bucle de productor adquirió. Esta habilidad de almacenar temporalmente los datos minimizará la pérdida de información.

Regresar al Inicio
2. Construir un Productor/Consumidor

Al igual que con el patrón estándar Maestro/Esclavo, el diseño Productor/Consumidor consiste en bucles paralelos que se separan en dos categorías; productores y consumidores. La comunicación entre el bucle productor y el consumidor se realiza utilizando colas de datos.
LabVIEW tiene funcionalidad de colas incorporado en forma de VIs en una paleta de funciones. Estos VIs se pueden encontrar en la paleta de funciones bajo Advance >> Synchronization >> Queue Operations. Las colas son la base de la teoría “First in-First out” o FIFO (primero en entrar, primero en salir). En el patrón de diseño Productor/Consumidor, las colas se pueden inicializar fuera de ambos bucles. Puesto que el bucle productor produce datos para el bucle consumidor, este le agregará datos a la cola (agregar datos a la cola se conoce como “encolar”). El bucle consumidor removerá datos de esa cola (remover datos de una cola se conoce como “desencolar”). Puesto que las colas son FIFO, la información siempre será analizada por el consumidor en el mismo orden en que fue colocada dentro de la cola por el productor. La figura 1 ilustra cómo el patrón de diseño Productor/Consumidor se puede crear en LabVIEW.