Libreria de flujo de datos en C# (TPL Dataflow)

La librería paralela de tareas ( las siglas en inglés TPL: Task Parallel Library) proporciona componentes de flujo de datos para ayudar a aumentar la solidez de las aplicaciones que están disponibles para la concurrencia. Estos componentes de flujo de datos se denominan colectivamente librería de flujo de datos (TPL Dataflow). Este modelo de flujo de datos promueve la programación basada en actores al proporcionar el pasaje de mensajes en el proceso para el flujo de datos de grano grueso y las tareas de canalización. Los componentes de flujo de datos se basan en los tipos y la infraestructura de programación de TPL y se integran con el soporte de lenguajes como C#, Visual Basic y F# para la programación asincrónica. Estos componentes de flujo de datos son útiles cuando se tiene varias operaciones que deben comunicarse entre sí de forma asincrónica o cuando se desea procesar datos a medida que están disponibles. Por ejemplo, consideremos una aplicación que procesa datos de imágenes desde una cámara web. Al usar el modelo de flujo de datos, la aplicación puede procesar cuadros de imagen a medida que estén disponibles. Si la aplicación mejora los cuadros de imagen, por ejemplo, al realizar la corrección de luz o la reducción de ojos rojos, puede crear un pipeline (una secuencia lineal) de componentes de flujo de datos. Cada etapa del pipeline podría usar una funcionalidad de paralelismo, como la funcionalidades que proporciona TPL, para transformar y mejorar la imagen.

El flujo de datos es un estilo de codificación muy declarativo: normalmente, primero define completamente la malla o engranaje (mesh en inglés) y luego comienza a procesar los datos. La malla termina siendo una estructura a través de la cual fluyen los datos. Esto requiere que pensemos nuestra aplicación un poco diferente, pero una vez que damos ese salto, el flujo de datos se convierte en un ajuste natural para muchos escenarios. Cada pipeline está compuesto por varios bloques que están vinculados entre si. Los bloques individuales son simples y son responsables de un solo paso en el procesamiento de datos. Cuando un bloque termina de trabajar en sus datos, pasará su resultado a los bloques vinculados.

Nota: Para usar TPL DataFlow, se debe instalar el Nuget package System.Threading.Tasks.Dataflow en su aplicación.

Vinculando bloques

Hay mucho para ver en este tema, pero como les comentaba mas arriba, el primer paso es como podemos hacer para vincular cada uno de los bloques de datos. Los bloques proporcionados por la biblioteca TPL Dataflow definen solo los miembros más básicos. En realidad, muchos de los miembros más últiles de TPL Dataflow son en realidad métodos de extensión. Por ejemplo el método extensión LinkTo proporciona una manera fácil de vincular bloques de flujo de datos.

Por defecto, los bloques de flujo de datos vinculados solo propagan datos; no propagan la completitud del bloque (o errores que puedan suceder). Si nuestro flujo de datos es lineal (lo que se conoce en inglés como pipeline), entonces probablemente quisiéramos propagar la completitud del bloque o posibles errores. Para propagar la finalización del bloque (y los errores), podemos configurar la opción PropagateCompletion en la vinculación:

Una vez vinculados, los datos fluirán automáticamente desde el bloque de origen al bloque de destino. La opción PropagateCompletion hace fluir la finalización del bloque además del pasaje de los datos; sin embargo, en cada paso del pipeline, un bloque con errores propagará su excepción al siguiente bloque envuelto en un  AggregateException. Entonces, si tiene un pipeline extenso que propaga las culminaciones de los bloques, el error original puede estar anidado en varias instancias de AggregateException. AggregateException tiene varios miembros, como Flatten, que ayudan con el manejo de errores en esta situación.
Es posible vincular bloques de flujo de datos de muchas maneras; nuestra malla (mesh) puede tener bifurcaciones y uniones e incluso bucles. Sin embargo, el pipeline simple y lineal es suficiente para la mayoría de los escenarios.
El tipo DataflowLinkOptions  brinda varias opciones diferentes que se  pueden establecer en una vinculación (como la opción PropagateCompletion utilizada en este ejemplo), y la sobrecarga del método LinkTo también puede tomar un predicado que se puede usar para filtrar qué datos pueden pasar por el enlace. Si los datos no pasan el filtro, no viajarán. Los datos que pasan el filtro viajan por ese enlace; los datos que no pasan el filtro intentan pasar por un enlace alternativo y permanecen en el bloque si no hay otro enlace que pueda tomarlo. Si un elemento de datos se “atasca” en un bloque como este, ese bloque no producirá ningún otro elemento de datos; todo el bloque se detiene hasta que se elimina ese elemento de datos.

 

Bueno hasta aquí con esta introducción a TPL Dataflow para conocer un poquito esta poderosa librería. Hay mucho más para hablar sobre este tema como por ejemplo como manejar la propagación de errores, desvincular bloques o crear bifurcaciones en nuestro flujo de datos. Espero que pueda ser de utilidad, y ser un punto de partida para conocer esta librería y que puedan utilizarla en sus proyectos. Si desean, pueden dejar sus comentarios aquí debajo en el post. Hasta la próxima !!

The following two tabs change content below.
Admin

Admin

Administrador de Dotnetuy, con más de 20 años de experiencia en el mundo de la informática y el desarrollo de software en diferentes lenguajes, trabajando en backend y frontend, desde sus primeros pasos con clipper cuando comenzaba la década de los 90’s , y continuando con pascal, C, C++, Visual basic, y multiples gestores de bases de datos hasta hoy en día con C# y todas las técnologias relacionadas con .NET.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *