TPL数据流(TDF)和响应式扩展之间有什么区别?



在谷歌上搜索了几天后,我想我无法决定哪个适合什么场景。当然,我想使用一个完美的框架,结合两者(当然不现实)。我甚至知道它们可以一起使用。但真正的问题是,这两款游戏的核心设计元素是什么?这些是我找到的:

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

如果能有一些不是像列表那样的理解,而是试图从一个共同的抽象类/类别中派生出来,只讨论结构上的差异,那就太好了。

我认为处理这个问题的最好方法是只关注你问题的第一行——决定在给定的场景中使用哪一行。

这两个库用于不同的目的。猜测每个设计的核心元素来寻找差异,感觉就像问为什么粉笔尝起来不像奶酪一样——尽管我不能挑剔你列出的具体点。

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

Rx

响应式扩展(Reactive Extensions, Rx)是一个用于组合异步和使用可观察序列和linq风格查询的基于事件的程序操作符。使用Rx,开发人员可以使用LINQ操作符,并参数化异步中的并发性数据流使用调度器。简单地说,Rx = Observables + LINQ +调度器

我还想看看我的另一个答案,它在考虑Rx时非常相关:在哪里与响应式编程划清界限。这样做的本质是,Rx可以很好地响应您无法及时控制的事件。

TPL数据流

任务并行库(TPL)提供了数据流组件来提供帮助增加支持并发的应用程序的健壮性。这些数据流组件统称为TPL数据流图书馆。该数据流模型促进了基于角色的编程为粗粒度数据流提供进程内消息传递流水线工作。数据流组件构建在类型和TPL的调度基础设施,并与c#、Visual集成Basic和f#语言支持异步编程。这些当您有多个操作时,数据流组件非常有用必须彼此异步通信还是在需要时进行通信处理可用的数据。例如,考虑一个处理来自网络摄像机的图像数据的应用程序。通过使用数据流模型,应用程序可以把图像帧当作它们来处理变得可用。如果应用程序增强图像帧,则为例如,通过进行光线矫正或减少红眼,您可以创建数据流组件的管道。管道的每个阶段可以使用更粗粒度的并行功能,例如TPL提供的功能,用于转换图像。

最新更新