.net - para - tag assistant
¿Cuáles son las diferencias entre el flujo de datos TPL(TDF) y las extensiones reactivas? (1)
Creo que la mejor manera de lidiar con esto es concentrarse solo en la primera línea de su pregunta: decidir cuál usar para un escenario determinado.
Las dos bibliotecas tienen diferentes propósitos. Especular sobre los elementos centrales del diseño de cada uno para buscar diferencias es como preguntar por qué la tiza no sabe a queso, aunque no puedo criticar los puntos específicos que mencionó.
En mi experiencia, rara vez hay escenarios no triviales donde son intercambiables de alguna manera sensible. Creo que las descripciones reales de su documentación hacen una respuesta bastante autoexplicativa a esta pregunta:
Rx
Extensiones reactivas (Rx) es una biblioteca para componer programas asíncronos y basados en eventos utilizando secuencias observables y operadores de consulta de estilo LINQ. Usando Rx, los desarrolladores representan flujos de datos asíncronos usando operadores LINQ, y parametrizan la concurrencia en los flujos de datos asíncronos usando Programadores. En pocas palabras, Rx = Observables + LINQ + Schedulers
También vería mi otra respuesta aquí, que es bastante relevante al considerar Rx: dónde dibujar la línea con la programación reactiva . La esencia de esto es que Rx es bueno para responder a eventos que no controla de manera oportuna.
Flujos de datos TPL
La biblioteca paralela de tareas (TPL) proporciona componentes de flujo de datos para ayudar a aumentar la robustez de las aplicaciones habilitadas para la concurrencia. Estos componentes de flujo de datos se conocen colectivamente como la Biblioteca de flujo de datos TPL. Este modelo de flujo de datos promueve la programación basada en actores al proporcionar el paso de mensajes en 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 la TPL y se integran con el soporte de lenguaje C #, Visual Basic y F # para la programación asíncrona. Estos componentes de flujo de datos son útiles cuando tiene varias operaciones que deben comunicarse entre sí de forma asíncrona o cuando desea procesar datos cuando estén disponibles. Por ejemplo, considere una aplicación que procesa datos de imagen de una cámara web. Al utilizar el modelo de flujo de datos, la aplicación puede procesar marcos de imagen a medida que estén disponibles. Si la aplicación mejora los marcos de imagen, por ejemplo, mediante la corrección de la luz o la reducción de ojos rojos, puede crear una tubería de componentes de flujo de datos. Cada etapa de la tubería podría usar una funcionalidad de paralelismo de grano grueso, como la funcionalidad que proporciona el TPL, para transformar la imagen.
Después de días de google, creo que no puedo decidir cuál es para qué escenario. Por supuesto, me gustaría usar un marco perfecto que combine ambos (no es realista, por supuesto). Incluso sé que es posible usarlos juntos. Pero la pregunta real es cuáles son esos elementos centrales de diseño en cada uno que hacen que sea imposible emular uno con el otro. Estos son los que encontré:
- en RX hay tiempo virtual, por lo que el programador controla efectivamente toda la red, pero esto no es posible en TDF porque cada bloque usa diferentes tareas y se ejecutan de forma independiente
- en TDF un bloque puede reintentar recibir un mensaje / reenviar y cosas así, pero en RX no es posible.
- en rx el flujo de datos se serializa pero en TDF esto es opcional
Sería bueno tener una comprensión que no sea similar a una lista en lugar de algo que intente derivar de una clase / categoría abstracta común hablando solo de las diferencias estructurales.