写点什么

声明式、命令式以及基于任务的并行化.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:45683
用户头像

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

关注

评论

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

什么是DevSecOps?理解DevOps安全性

华为云PaaS服务小智

DevOps

设计模式之美——对扩展开放、对修改关闭

GalaxyCreater

设计模式

华为云CodeArts Req需求管理工具,7大特性限时免费体验

华为云开发者联盟

需求管理 开发 华为云 12 月 PK 榜

YOLOv5全面解析教程②:如何制作训练效果更好的数据集

OneFlow

人工智能 深度学习 数据集

极客时间运维训练营第九周作业

好吃不贵

为什么更推荐使用组合而非继承关系?

JAVA旭阳

Java 架构

贾斯特里尼&布鲁克斯葡萄酒,用品质征服世界

联营汇聚

【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结

HMS Core

HMS Core

【Java基础】Win10如何配置jdk环境变量(配置java环境变量)

No8g攻城狮

Java、 java 并发 Java IO

270年经典传承,贾斯特里尼&布鲁克斯——红酒中的高端代表

联营汇聚

贾斯特里尼&布鲁克斯为何被称为葡萄酒典范?

联营汇聚

世界元素多元化发展,法国名酒贾斯特里尼&布鲁克斯受推崇

联营汇聚

超越10倍开发者

俞凡

研发效能

架构误区系列9:强扭的「复用」

agnostic

【web 开发基础】PHP 中的预定义数组详解之一 (47)

迷彩

数组 全局变量 PHP基础 预定义数组

设计模式之美——里式替换(LSP)

GalaxyCreater

设计模式

基于随机森林算法进行硬盘故障预测

华为云开发者联盟

人工智能 机器学习 华为云 12 月 PK 榜

ChatGPT进化的秘密

OneFlow

人工智能 机器学习 深度学习 GPT

MMEval正式支持OneFlow评测

OneFlow

机器学习 深度学习 算法

2022-12-24:给定一个字符串s,其中都是英文小写字母, 如果s中的子串含有的每种字符都是偶数个, 那么这样的子串就是达标子串,子串要求是连续串。 返回s中达标子串的最大长度。 1 <= s的长

福大大架构师每日一题

Linux 算法 Shell 福大大

Android Studio开发Android APP

向阳逐梦

Android Studio 开发环境 新建工程

基于K-means聚类算法进行客户人群分析

华为云开发者联盟

人工智能 机器学习 华为云 12 月 PK 榜

Java中Map集合的三种遍历方式

@下一站

Java 程序设计 map 12月日更 12月月更

Spring单例和静态方法

hasWhere

Zebec Chain缘何能成为新晋应用链,熊市下又为何值得我们关注?

EOSdreamer111

跨平台应用开发进阶(四十)自定义插件及引用

No Silver Bullet

uni-app 跨平台应用 12月月更 自定义插件

LED显示屏行业真的需要8K分辨率吗?

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

项目管理系统哪最好?

PingCode

还在手动发早安,教你用java实现每日给女友微信发送早安

华为云开发者联盟

Java 开发 代码 华为云 12 月 PK 榜

Zebec Chain缘何能成为新晋应用链,熊市下又为何值得我们关注?

股市老人

HTTP通用首部字段

穿过生命散发芬芳

HTTP 12月月更

  • 扫码添加小助手
    领取最新资料包
声明式、命令式以及基于任务的并行化.NET开发_.NET_Jonathan Allen_InfoQ精选文章