2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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:501841
用户头像

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

关注

评论

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

优酷鸿蒙开发实践|多屏互动开发实践

阿里巴巴终端技术

ios android 鸿蒙 优酷 客户端

资讯|WebRTC M94 更新

网易云信

大前端 chrom

精细运营|营销获客自动化‘攻心’

海比研究院

CRM

空调可视化运营中心,赋能精细化运营管理

ThingJS数字孪生引擎

打破数据壁垒,北鲲云超算混合云模式激活人工智能数据价值

北鲲云

二本渣渣的金九银十辛酸面试之旅:5 面阿里(Java岗) 侥幸上岸

Java 编程 程序员 架构 面试

事件管理CRM系统是活动策划工作的必要工具

低代码小观

CRM 管理系统 事件管理 CRM系统 活动策划

CFI技术新探索,struct_san今日登场

腾讯安全云鼎实验室

云安全

科技热点周刊|微软发布 Web 版 VSCode、 删除 .NET 6 热重载引发不满、IBM 发布开源混合云介绍指南

青云技术社区

云计算 云原生 kubenetes CockroachDB

终于有人把云原生存储讲明白了

青云技术社区

云计算 云原生 存储 Cloud Native

【权限专栏】联盟链的“圆桌会议”

趣链科技

模块2

Asha

使用 Spring Boot 和 @WebMvcTest 测试 MVC Web Controller

码语者

Java Spring Boot test

腾讯数字生态大会【TechoDay技术回响日】

腾讯云数据库

快手技术嘉年华 | 与你漫游技术星辰大海

快手中学

技术 校招 快手

架构训练营模块1作业

Puciu

架构实战营

模块一作业

hpl

高校人才集聚飞桨启航菁英计划!百度联合中国图象图形学学会助力AI人才培养

百度大脑

人工智能 百度 图像

4个实验,彻底搞懂TCP连接的断开

Java 架构 TCP 后端 网络编程

第二存储解决方案白皮书 | 专为非生产数据而设计的存储方案

QingStor分布式存储

云原生 分布式存储

联想智慧服务荣获第17届“金耳唛杯”年度总冠军

科技大数据

模块2总结

Asha

架构实战营

打破 Serverless 落地边界,阿里云 SAE 发布 5 大新特性

阿里巴巴云原生

阿里云 Serverless 云原生 Serverless Kubernetes

【引航计划】优质内容合集名单公布

InfoQ写作社区官方

引航计划 热门活动

anyRTC从服务到产品全链路服务保障升级

anyRTC开发者

音视频 直播 实时通信 语音通话 视频通话

这才是责任链模式的优雅使用方式

Tom弹架构

Java 架构 设计模式

自定义ViewGroup的触摸反馈

Changing Lin

10月月更

校招失败,在小公司熬了2年后我终于进了阿里,竭尽全力(Java岗)

Java 程序员 架构 面试 计算机

用会声会影制作手链的展示视频

懒得勤快

浪潮云说丨构建全域业务联动枢纽,挖掘数据要素创新价值

云计算

官方线索 | 1024新华三服务器性能调优挑战赛

穿过生命散发芬芳

1024我在现场

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