BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

TPL Dataflow——CCR的后继

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 张龙 关注 14 他的粉丝 发布于 2011年1月10日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

哥有话要说 by Yu Wang

不是哥挑剔. 麻烦请各位编辑在翻译之前对这个技术有一个粗浅的预研. 这样生硬粗糙的, 毫无营养的翻译文章只能让读者觉得不值得浪费阅读时间.

Re: 哥有话要说 by 龙 张

上面的朋友你好,这篇新闻是我翻译的。不知你的意思是原文没有营养,还是翻译之后的文字没有营养,如果是前者,那我没法控制;如果是后者,那是我的责任,还请指明是何处有问题,这也会帮助我们不断改进自己。读者阅读需要花费时间,而编辑翻译也需要时间,而且需要更长的时间,谢谢

哥也有话要说 by Xu Yongrui

其实,InfoQ还是不错的,文章内容相对很多网站都高。而且InfoQ都提供了原文查看功能,如果觉得该技术营养不高,可以向微软建议,让他们继续改进。如果觉得翻译不高,没人逼你看中文,相信经常来InfoQ的英文阅读水平都不低。大家应多进行技术交流,少进行无意义的指责攻击。

Re: 哥也有话要说 by hongyuan cai

确实如此~

Re: 哥有话要说 by Yu Wang

Hello, 抱歉我无意挑起人身攻击或论战. 我只是作为一个普通IT从业人员向各位编辑如实反映阅读到此文章时的实际感受. ok, 那么实际情况(也可以作为目标阅读群的一个标准参考系)是: 每天我们大概需要花10-12个小时时间沟通, 文档, 设计, 编码. 完事之后各位感觉如何我不太清楚, 反正我脑子是一片浆糊. ok, 为了明天能够继续从事这个行业, 我们不得不在一片浆糊的情况下在花上一个小时+的时间阅读网络上的各种资讯(当然也包括八卦), 平均阅读数量大概在100篇左右. 摊上这篇文章大概不到一分钟. 说到这里问题就来了. 尽管我从事.net企业应用开发6年+, 但也没有能看出来这篇文章中提及的技术会对我目前的工作, 以及将来1-2年的工作会产生何种影响. 具体来说, 我是通过RSS订阅到这篇文章的. 摘要中的"面向高并发应用而推出的新程序库这句话吸引了我. 为什么能吸引我呢? 因为这句话我看懂了, 并且工作中我的确需要处理一些高并发的case. 所以我点击进来, 但是, 坦率的讲, 文章中的"块可以使用贪婪或非贪婪的方式使用数据", "当某个块需要接收多个源的输入时,它会等待,直到所有源的数据都可用为止。" 诸如此类的描述让我不知所云. 因为我的脑子中没有贪婪或非贪婪方式的概念, 也没有为什么需要"知道所有源的数据都可用为止"的一个背景知识. 你可以说我这水平就不该看这文章, ok, infoq的文章如果只供大神级的人物阅读那就是另外一个问题了. 我的意思是, 编辑同志们, 大家的时间都很有限, 你的, 我的, 所有混it圈的. 如果读者不能在平均1分钟的时间内准确了解到文章的内容, 或者进一步的作出判断, 客观的说这是在浪费时间. sorry, 说的有点白. anyway, 我理解的好文章, 不在于讲的技术多深奥, 也不在于翻译要多精准, 关键是, 要能让读者有收获, 能做出判断.

张龙是个热心的好同志. 除了自己花1个小时阅读之外还能再挤出1个小时帮我们翻译出来贴在infoq上, 本来我们不应该再多要求什么. 只是觉得每天花1个小时看完100篇技术文章后, 脑子更加浆糊, 这事不太靠谱, 要改变.

Re: 哥有话要说 by 龙 张

楼上的朋友,你好。关于你所指出的贪婪方式与非贪婪方式,我相信看了后面的解释应该会清楚吧。不知何处造成了阅读干扰。关于“当某个块需要接收多个源的输入时,它会等待,直到所有源的数据都可用为止”,意思是块要想接收多个源的输入,如果这时至少有一个源的数据没有准备好,那他就不会接收,而是等到所有源全部准备好后才开始接收处理。贪婪与非贪婪方式使用数据的原文是“Blocks can consume data on a greedy or non-greedy fashion”,如果是楼上的朋友翻译,会翻译成什么呢,还请不吝赐教,你的建议就是我们前进的力量源泉,人都会犯错,关键是知道自己犯了什么错,在何处犯的错,这样才能更好的改进,不是吗?

Re: 哥有话要说 by 龙 张

另外再补充一下,虽说我现在主要做Mac和Java方面的开发,但.NET领域也接触了好几年了,对于自己不熟悉的领域我是不敢翻译的,以免贻笑大方啊

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

7 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT