写点什么

实现自定义的任务并行库(TPL)数据流 Block

  • 2012-01-30
  • 本文字数:895 字

    阅读完需:约 3 分钟

数据流 Block(Dataflow Block)是.NET 4.5 中新的高性能并行处理程序库的支撑核心。尽管其中提供了很多现成的功能,但有时候仍然需要自定义的 block。Zlatko Michailov 完成了一个文档,其中列出了定制的过程,还指出可能会遇到的诸多陷阱。完整的指南《实现自定义的任务并行库(TPL)数据流Block》可以在 Parallel Programming with .NET 中找到,我们这里会提供一些重点。

Zlatko 提醒:在动手之前,你要先考虑是不是就是把现有的 ITargetBlock 和 ISourceBlock 放在一起。如果是的话,Encapsulate 函数会给你创建一个新的 IPropagatorBlock 。该函数会完成大部分的样板代码,但是你仍然要显式声明如何把消息从目标传递到来源 block。

要想有更多控制,你可以显式实现 ITargetBlock ISourceBlock 。与大多数抽象接口不同,不是所有的方法都要在实现类的公共接口上暴露出去。有些方法,比如 LinkTo 和 Complete 是要被通用代码调用的,而其他像 OfferMessage 这样的方法,只能被其他 block 通过抽象接口调用。指南中的 5.1 节针对每个方法推荐了可见性规则。

接下来 Zlatko 展示了两个详细的例子。第一个是同步过滤 block,第二个是同步变型 block。尽管其中有很多样板代码,但的确演示了很多 TPL 数据流的内部运作机制。

Zlatko 谈到异步 block 时,真正难以对付的代码出现了。你从一开始就要考虑锁层次这样的东西。Zlatko 推荐内建 block 使用的方法,包括一个外发(outgoing)锁,一个进入(incoming)锁和一个值锁(value lock)。

标记一个 block 为完成,这看起来很简单,只要在调用 Complete 或 Fault 时设置 Completion 属性即可。可一旦开始使用异步 block,即使是这样的操作也会很麻烦。比如,实际完成属性设置时,必须保证没有拥有某个锁,因此这可能出发其他的同步代码。

另一个考虑在于:是以贪婪还是非贪婪的方式消费消息。如果使用非贪婪 block,那就得采用额外步骤,避免与监听同一个来源的其他目标冲突。

最后,Zlatko 谈到了提供消息和链接目标。不过这就简单了,因为所有的操作本意都采取同步方式。

如果想了解更多信息,请查看 DevLaps 上的 TPL 数据流网站。

查看英文原文: Implementing Custom TPL Dataflow Blocks

2012-01-30 02:341695
用户头像

发布了 479 篇内容, 共 158.7 次阅读, 收获喜欢 50 次。

关注

评论

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

Vue都使用那么久了,还不了解它的生命周期吗

CRMEB

首发!OceanBase社区版入门教程开课啦!

OceanBase 数据库

数据库 开源 新闻 课程 oceanbase

“2021ISIG中国产业智能大会低代码峰会”即将开幕,钉钉宜搭叶周全受邀出席

一只大光圈

阿里巴巴 互联网 钉钉 低代码 钉钉宜搭

Flutter设置App的应用名字和应用logo图标的方法

坚果

flutter 11月日更

今日谈:BoltDB数据库,一款纯Go实现的KV数据库

恒生LIGHT云社区

数据库 Go 语言 BoltDB

一起来写 VS Code 插件:实现一个翻译插件

狂奔滴小马

JavaScript vscode 大前端 vs

《深入理解JVM虚拟机》读书笔记:第一章

Joseph295

入驻快讯|欢迎ShowMeBug正式入驻 InfoQ 写作平台!

InfoQ写作社区官方

使用 NextJS 和 TailwindCSS 重构我的个人博客

狂奔滴小马

大前端 Blog nextjs

图论算法:稳定婚姻问题,如何找到最适合自己的另一半

博文视点Broadview

一起来写 VS Code 插件:为你的团队提供常用代码片段

狂奔滴小马

vscode 大前端

使用 Omnibus 安装极狐GitLab

极狐GitLab

极狐GitLab 安装使用

使用 ABAP 代码提交 SAP CRM Survey 调查问卷

汪子熙

CRM SAP abap 11月日更 问卷模型

SAP CRM Survey调查问卷的模型设计原理解析

汪子熙

中间件 CRM SAP C4C 11月日更

管理纪要

KoLee

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」让我们一起探索一下DefaultMQPullConsumer的实现原理及源码分析

洛神灬殇

阿里巴巴 RocketMQ 消息队列 11月日更 Apache RocketMQ

人脸检测实战:使用opencv加载深度学习模型实现人脸检测

AI浩

零基础学习前端开发技术的方法分享

@零度

大前端

正确学习大数据开发技术的方法有哪些

@零度

大数据

netty系列之:在http2中使用framecodec

程序那些事

Java java 并发 程序那些事 11月日更

Linux学习有用吗?《Linux一学就会》

侠盗安全

Linux linux运维 云计算架构师 linux电子书

百亿级存储+毫秒级写入!TDengine如何轻松玩转“潮鞋”APP?

TDengine

tdengine 时序数据库

我们如何实现“业务 100% 云原生化,让阿里中间件全面升级到公共云架构”?

阿里巴巴中间件

阿里云 云原生 中间件 三位一体

一文讲透如何用明道云构建物料需求计划系统

明道云

java语言前景怎么样,到底需不需要参加培训

@零度

Java JAVA开发

StarRocks Hacker Meetup 小记 Part 2|实时更新场

StarRocks

大数据 Meetup StarRocks

智能运维中的指标预测

云智慧AIOps社区

算法 智能运维 预测 指标

一起来写 VS Code 插件:VS Code 版 CNode 已上线

狂奔滴小马

JavaScript vscode 大前端

Android C++系列:Linux进程间通信(一)

轻口味

c++ android 11月日更

用 NodeJS 开发一版在线流程图网站

狂奔滴小马

JavaScript 大前端 Node

Python代码阅读(第62篇):列表是否包含相同元素判断

Felix

Python 编程 列表 阅读代码 Python初学者

实现自定义的任务并行库(TPL)数据流Block_.NET_Jonathan Allen_InfoQ精选文章