TPL Dataflow(TDF)和Reactive Extensions之间有什么区别?

时间:2013-01-18 16:17:41

标签: .net task-parallel-library system.reactive tpl-dataflow

经过几天的谷歌搜索后,我想我无法确定哪一个是针对什么情况。当然我想使用一个结合两者的完美框架(当然是不现实的)。我甚至知道可以一起使用它们。但真正的问题是,每个核心设计元素中的核心设计元素是什么,使得无法模仿另一个核心设计元素。 这些是我发现的:

  • 在RX中存在虚拟时间,因此调度程序有效地控制整个网络,但这在TDF中是不可能的,因为每个 block使用不同的任务并且它们独立运行
  • 在TDF中,一个块可以重试接收消息/重发和类似的东西,但在RX中它是不可能的。
  • 在rx中,数据流被序列化,但在TDF中这是可选的

如果有一些不像列表那样的理解,那么试图从一个只讨论结构差异的公共抽象类/类别派生出来的东西会很好。

1 个答案:

答案 0 :(得分:6)

我认为处理此问题的最佳方法是只关注问题的第一行 - 决定在给定方案中使用哪一个。

这两个库有不同的用途。推测每个设计的核心元素以寻找差异感觉就像问为什么粉笔不像奶酪一样味道 - 虽然我不能错过你列出的具体点。

根据我的经验,很少有非平凡的场景,它们可以以任何合理的方式互换。我认为他们的文档中的实际描述对这个问题提出了一个非常不言自明的答案:

的Rx

  

Reactive Extensions(Rx)是一个用于组合异步和   使用可观察序列和LINQ样式查询的基于事件的程序   运营商。使用Rx,开发人员使用。来表示异步数据流   LINQ运算符,并在异步中参数化并发   使用调度程序的数据流。简单地说,Rx = Observables + LINQ +   调度

在考虑Rx:Where to draw the line with reactive programming时,我也会在这里看看我的另一个答案。其实质是,Rx有助于回应您无法及时控制的事件。

TPL数据流

  

任务并行库(TPL)提供数据流组件以提供帮助   增加启用并发的应用程序的健壮性。这些   数据流组件统称为TPL数据流   图书馆。此数据流模型通过提升基于actor的编程   为粗粒度数据流提供进程内消息传递   流水线任务。数据流组件基于类型和   调度TPL的基础设施并与C#,Visual集成   异步编程的基本和F#语言支持。这些   当您有多个操作时,dataflow组件非常有用   必须异步或在需要时彼此通信   处理数据,因为它变得可用。例如,考虑一个   处理来自网络摄像头的图像数据的应用程序。通过使用   数据流模型,应用程序可以处理图像帧   变得可用。如果应用程序增强图像帧,为   例如,通过执行光线校正或防红眼,您可以   创建数据流组件的管道。管道的每个阶段   可能会使用更粗粒度的并行功能,例如   TPL提供的功能,用于转换图像。