大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

TPL Dataflow——CCR 的后继

  • 2011-01-09
  • 本文字数:1099 字

    阅读完需:约 4 分钟

TPL Dataflow 是微软面向高并发应用而推出的新程序库。借助于异步消息传递与管道,它可以提供比线程池更好的控制,也比手工线程方式具备更好的性能。代价则是你需要遵循.NET 程序员并不太熟悉的一些设计模式。

一个数据流包含了一系列的“块(block)”。在之前的 CCR 中,每个块叫做一个端口(port),它可以是源数据,也可以是目标数据。通常需要将数据发送给一个传播块以让数据进入到数据流当中,所谓传播块就是实现了 ISourceBlock 与 ITargetBlock 的块。由于传播块也是源,因此它可以链接到其他目标或是传播块上。数据流以异步方式从一个块进入到另一个块当中,根据需要它通常在源或目标处进行缓存。

见名知意,TPL Dataflow 底层的基础设施是.NET 4 的 Task Parallel Library。与 TPL 一样,你可以使用客户化实现替换掉默认的调度器。开箱即用的实现就是.NET 的线程池系统以及使用了异步上下文的框架。如果你希望将数据流运行在特定的线程上时通常会使用后者,比如说使用数据流操纵 GUI 时。文档在这点上描述的并不是十分清楚,但似乎你可以每个块为基础设置调度器。如果真的是这样,那它真的是提供了一种优秀的方式将数据编排到 GUI 线程上了。

默认情况下,数据流已经针对性能进行了调解,实现方式也很棒,这意味着一旦激活了某个块,那么它就会继续处理数据直到运行完毕。为了防止某个块消耗掉所有可用资源,我们可以为其设置一个消息数限定值。如果设置了,那么块只会处理设定的数据量,然后就会终止当前任务并由下一个接管。

块可以使用贪婪或非贪婪的方式使用数据。当多个目标都在争夺同一个源的消息时,后者的价值就彰显出来了。比如说,在使用多个目标对同一源进行负载平衡时,你想要保证这些目标是非贪婪的,以免所有数据都进入到第一个贪婪的块当中。使用非贪婪方式的另一个原因是当消息被新版本替换掉时能够丢弃掉这些消息。Broadcast 块就能说明这个问题。它将每条消息提供给每个目标。如果目标不接受该块,那么在 Broadcast 块接收到下一条消息时它还是可用的。

现在来谈谈锁的问题,为了避免死锁,TPL Dataflow 采用了一个很有趣的设计。当某个块需要接收多个源的输入时,它会等待,直到所有源的数据都可用为止。这样,它将使用两阶段提交来保证确实从每个源获取到了数据。我们强烈推荐开发者使用这种机制,不要手工锁定工作流中的数据。

这种设计可能会导致竞态条件,尤其是与 Broadcast 这样的块联合使用时更是如此。本质上,该问题源自于一条消息被多个块发送并操纵了。既然块会干扰到调度器,那么将不变的数据类型作为消息会更加安全。

目前, TPL Dataflow Library 与 Async CTP 都可以下载了。

查看英文原文: TPL Dataflow – The Successor to CCR

2011-01-09 11:502072
用户头像

发布了 88 篇内容, 共 272.8 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

探索车路云深度融合的优化与实践

观测云

人工智能

文档解析与向量化技术加速多模态大模型训练与应用

热爱编程的小白白

JDBC连接openGauss6.0和PostgreSQL16.2性能对比

华为云开发者联盟

数据库 JDBC 华为云 华为云开发者联盟 企业号2024年5月PK榜

探索未知:风靡硅谷开发者的 Unstructured Data Meetup 即将登陆中国

Zilliz

AI 非结构化数据 Meetup Zilliz

从零开始:使用 Playwright 脚本录制实现自动化测试

霍格沃兹测试开发学社

浅谈设计模式

Ethan

Java 设计模式

解锁弹框:Python 下的 Playwright 弹框处理完全指南

霍格沃兹测试开发学社

9大原因分析贝莱德投资RWA赛道的ONDO 逻辑,内附

股市老人

俄罗斯方块游戏编程

芯动大师

编程 俄罗斯方块游戏 51单片机

国标参编征集 | 关于公开征集《物流企业数字化 第二部分:平台架构》国家标准起草单位的通知

信通院IOMM数字化转型团队

数字化转型 物流

免费的集成组件有哪些?

谷云科技RestCloud

ETL 数据集成 ETLCloud

我,古希腊掌管「智算」的神!

白洞计划

AI 智算

有了1688跨境接口,没有1688代采系统怎么办?

tbapi

1688API接口 1688代采系统

容器技术:优化软件测试流程的利器

霍格沃兹测试开发学社

Python函数与模块的精髓与高级特性

华为云开发者联盟

Python 华为云 函数 华为云开发者联盟 企业号2024年5月PK榜

hoobuy淘宝代购系统 VS Pandabuy淘宝代购系统哪些软件公司可以开发

tbapi

淘宝代购系统 Pandabuy 淘宝代购集运 Hohobuy

【YashanDB知识库】ycm托管数据库时,数据库非OM安装无法托管

YashanDB

yashandb 崖山数据库 崖山DB

精准记录:使用 Playwright 实现屏幕截图

霍格沃兹测试开发学社

知识付费的感想

玄兴梦影

F5G-A万兆光网商用启航,挥动FTTR F50星光之翼

脑极体

光网络

TPL Dataflow——CCR的后继_.NET_Jonathan Allen_InfoQ精选文章