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

21
经过数天的谷歌搜索,我认为我不能决定哪一个框架适用于哪种场景。当然我想使用一个完美的框架将两者结合起来(这是不现实的)。我甚至知道它们可以一起使用,但真正的问题是每个框架中的哪些核心设计元素使得它们不可能互相模拟。
以下是我找到的:
  • 在RX中,有虚拟时间,因此调度程序有效地控制整个网络,但在TDF中不可能,因为每个块都使用不同的任务并且它们独立运行
  • 在TDF中,块可以重试接收消息/重新发送等操作,但在RX中不可能。
  • 在RX中,数据流是串行化的,但在TDF中这是可选的
最好有一些理解,不是像列表那样,而是尝试从一个共同的抽象类/类别派生两个框架,只讨论结构上的差异。

4
@casperOne:我从未说过它们是相互矛盾的。你能提出一种有建设性的问题形式吗?我认为我的观点仍然有效。为什么不回答这个问题,而是关闭它呢? 我从未说它们是相互矛盾的。你能提出一些有建设性的问题形式吗?我认为我的观点仍然正确。为什么不回答这个问题,而要将其关闭呢? - naeron84
因为你正在要求一个列表(差异),而列表问题由于许多原因而被关闭为“不具建设性”(难以随时间维护,没有所谓的最佳差异等)。我进行了评论,因为我想帮助你,即使这个问题不适合该网站。话虽如此,我建议您询问使用TPL和/或Rx时遇到的具体问题。 - casperOne
2
@casperOne:不,我不是在要求一个列表,事实上恰恰相反:“……一些理解,它不像列表,而是试图从一个共同的抽象类/范畴中推导出结构差异。”(英语不是我的母语,所以也许我没有表达清楚,但重点是我想要一个有结构的答案,而不是一个列表)。 - naeron84
@naeron84 很不幸,这个问题的发展变成了一些并不适合的内容。你基本上在要求另一种表示实质上是一个列表的东西。 - casperOne
3
那么,你应该如何正确地提出这个问题呢?我对它们的意思逐一理解了,但我无法形成一个可适用于两者的元概念。 - naeron84
显示剩余3条评论
1个回答

8
我认为处理这个问题的最佳方法是仅关注您问题中的第一行 - 决定在给定场景下使用哪个库。
这两个库具有不同的用途。猜测每个设计核心元素以寻找差异感觉像是在问为什么粉笔不像奶酪一样好吃 - 尽管我不能指责你列出的具体观点。
根据我的经验,在任何明智的方式下,它们很少可以互换。我认为从他们的文档中实际描述对这个问题提供了一个相当自解释的答案:
Rx
“Reactive Extensions(Rx)是一个使用可观察序列和LINQ样式查询运算符组合异步和基于事件的程序的库。使用Rx,开发人员使用LINQ运算符表示异步数据流,并使用调度器参数化异步数据流中的并发性。简而言之,Rx = Observables + LINQ + Schedulers。”
当考虑 Rx 时,我还会看一下我的其他答案,这是非常相关的:Where to draw the line with reactive programming。其实质是,Rx 对于及时响应您无法控制的事件非常有用。

TPL数据流

任务并行库(TPL)提供了数据流组件,以帮助增强并发应用程序的健壮性。这些数据流组件统称为TPL数据流库。此数据流模型通过提供进程内消息传递来促进基于Actor的编程,用于粗粒度数据流和流水线任务。数据流组件建立在TPL的类型和调度基础设施之上,并与C#、Visual Basic和F#语言支持异步编程集成。当您有多个操作需要异步地相互通信,或者想要在数据可用时处理数据时,这些数据流组件非常有用。例如,考虑一个从网络摄像头处理图像数据的应用程序。通过使用数据流模型,该应用程序可以随着图像帧的到来进行处理。如果应用程序增强图像帧,例如执行轻微纠正或消除红眼,您可以创建一个数据流组件的流水线。流水线的每个阶段可能使用更粗粒度的并行功能,例如TPL提供的功能,来转换图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接