写点什么

声明式、命令式以及基于任务的并行化.NET 开发

  • 2007-12-24
  • 本文字数:1543 字

    阅读完需:约 5 分钟

Daniel Moth 发布了四个关于.NET 并行扩展(Parallel Extensions for .NET)的视频,这些内容覆盖了最新为.NET 框架所发布的声明式、命令式以及基于任务的并行化 API。

第一个视频是对架构的总体观察,并且接触了一些示例。尽管这些示例是使用VB 或C#编写的,它们可以在任何.NET 语言中使用。

第二个视频介绍了PLINQ。PLINQ 是一个对XML 和内存对象进行并行查询的声明式的模型。PLINQ 是迄今为止.NET 平台上最容易利用多核特性的做法,只需要修改少许代码即可。

和LINQ 为IEnumerable 对象提供了一套扩展方法一样,PLINQ 为IParallelEnumerable 对象提供了一整套扩展方法。这些扩展在命名上与LINQ 提供的功能一一对应。如果要将一个IEnumerable 对象转换成IParallelEnumerable 对象,只需要调用IEnumerable.AsParallel 方法即可。

如果需要的话,对并行化进行控制也可以通过声明的做法。一些选项,例如是否维持原有的顺序,以及使用多少线程进行处理都可以通过向AsParallel 方法传递不同的参数来进行控制。

使用何种类型的并行处理也会受到查询的执行方式的影响。如果您在查询之上调用了ToList 方法,所有的线程将被分配用于处理这个查询。只有当整个工作结束之后主线程才会继续。这个就是所谓的“停止并前进”过程。

另一方面,如果您对于一个查询使用for-each 循环,那么执行模型将会完全不同。在这个被称为“并行管道”的模型下,主线程将会在另一个线程产出结果的同时进行循环处理。这个模型允许您访问处理过程中的中间状态,当您希望向socket 或文件系统输送数据时会发现这一点非常有用。但是如果您处于一个完全CPU 瓶颈的状况下,这个模型将会比“停止并前进”来的慢。

最后一个方法是反向枚举。一个新的ForAll 方法允许每个线程直接对于每个元素执行某个委托调用。由于您无需等待一个列表生成完毕(停止并前进)或者分配一个线程用于处理循环(并行管道),这可能是最有效率的方法了。

第三个视频有关命令式的并行处理。命令式的并行处理是基于并行版本的Do、For 和For-Each 操作。这些操作都可以接受一个委托,一般可以使用匿名方法的方式来传递。由于VB 不支持多行的匿名方法,C#在这方面有明显的优势。

从表面看来,这套并行库感觉和Fortran 或C 程序员在超级计算机使用的OpenMP 库非常相似。然而,它使用了闭包和线程本地存储来区分共享和隔离的变量。

第四个视频针对并行扩展的核心——任务并行库(Task Parallel Library)。任务并行库,又被称为TPL,本质上是一个高级版本的.NET 线程池。与线程池的功能类似,TPL 能够在线程和处理器之间实现负载均衡。与线程池不同的是,TPL 拥有一套丰富的API,能够支持Thread 类提出的许多概念。

TPL 还拥有一套从前的线程或线程池所不具备的新功能,例如任务拥有一个安全的 Cancel 方法。与 Thread.Abort 方法不同,它不会简单地杀死传递给该任务的工作。如果一个工作还没有分配给一个线程,它只是不会启动而已,否则这个工作会定期检查 Task.IsCancelled 属性。

一个任务的取消操作也可以传递给所有的子任务。不过目前这一点在默认情况下并不会发生,但是开发团队对于社区有关默认情况应该如此的感受很感兴趣。

查看英文原文: Declarative, Imperative, and Task-based Parallelism in .NET - - - - - -

译者简介:赵劼 (Jeffrey Zhao,网名老赵),毕业于复旦大学软件学院,曾任职于微软中国研发中心,现任某创业团队架构师。有 8 年左右的 Web 应用开发和 5 年左右的.NET 应用程序开发经验,对 ASP.NET 企业应用开发与客户端技术(如 JavaScript 和 AJAX 等)有较为深入的理论基础与实践经验,另外,他对 SOA、重构以及程序员能力与修养等相关问题也有着浓厚的兴趣,并且非常希望能够写程序到 60 岁。他的博客为: http://jeffreyzhao.cnblogs.com

2007-12-24 21:451285
用户头像

发布了 157 篇内容, 共 62.9 次阅读, 收获喜欢 6 次。

关注

评论

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

谁说count(*) 性能最差,我需要跟你聊聊

华为云开发者联盟

函数 count 字符 数据表

Linux之chown命令

入门小站

Linux

开源堡垒机可以一直免费使用吗?为什么?

行云管家

开源 网络安全 堡垒机

有道围棋 AI:智能匹配儿童棋力的良师益友

有道技术团队

网易有道 围棋

TDengine助力京东云IoT数据统计改造

TDengine

数据库 tdengine OpenTSDB

iOS开发-数据结构与算法学习之排序篇

iOSer

ios 算法 数据结构与算法 ios开发 iOS 知识体系

专家带你吃透 Flink 架构:一个新版 Connector 的实现

腾讯云大数据

flink 流计算 Oceanus

Tableau Day2: 可视化入门图形制作

贾献华

1月月更

设计是表达的艺术,不是艺术的表达

Yisen玩设计

优化服务器存储架构——Amazon EBS io2 Block Express正式推出!

亚马逊云科技 (Amazon Web Services)

存储

kafka的优缺点都有那些

编程江湖

kafka

网络安全好学吗?手把手教你学利用漏洞渗透 网络安全工程师学习资料汇总

学神来啦

【工具推荐】Github国内访问速度太慢?一招教你轻松搞定

恒生LIGHT云社区

GitHub

教程直播第6期 | OceanBase 如何进行 Benchmark 测试及调优

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 社区版

EventBridge 最佳实践场景:流计算 Oceanus 告警消息实时推送

腾讯云大数据

flink 流计算 Oceanus

Apache Flink 不止于计算,数仓架构或兴起新一轮变革

Apache Flink

大数据 flink 编程 实时计算 流式数仓

前端开发之CSS样式——自定义滚动条

@零度

CSS 前端开发

有了这个新特性,一扫实例存储数据丢失风险!

亚马逊云科技 (Amazon Web Services)

存储

利用Graviton2和CloudFront为S3对象存储动态生成缩略图

亚马逊云科技 (Amazon Web Services)

存储

java开发框架Redis之sentinel和集群

@零度

redis JAVA开发

快来一起玩转LiteOS组件:RHas

华为云开发者联盟

C语言 LiteOS 组件 RHas 哈希函数库

阿里副总裁浅雪对话VMware全球副总裁原欣:阿里云携手VMware,助力企业数字化转型

大咖说

云计算 阿里云 数字化转型 阿里巴巴‘

SAP HANA Delivery Unit概念简述

汪子熙

数据库 内存数据库 1月月更

手把手教你使用 Timestream 实现物联网时序数据存储和分析!

亚马逊云科技 (Amazon Web Services)

存储

二哥的小破站终于上线了,颜值贼高!

沉默王二

Java 分布式

低代码音视频开发训练营正在火热报名中!

阿里云CloudImagine

阿里云 低代码 低代码平台 媒体处理 视频云

在线CSS代码压缩美化工具

入门小站

工具

图形测试分析毫无头绪?HarmonyOS图形栈测试技术帮你解决|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

大数据开发之Hive表数据同步至HBase

@零度

大数据 hive HBase

十三部门修订发布《网络安全审查办法》,企业数据安全合规应尽早

行云管家

云计算 互联网 网络安全 数据安全

声明式、命令式以及基于任务的并行化.NET开发_.NET_Jonathan Allen_InfoQ精选文章