在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

关注

评论

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

抢先实测豆包1.8模型,多模态Agent超强!

苍何

通义开源端到端语音模型 Fun-Audio-Chat 8B;OpenTable 与 Yelp 竞速餐饮语音 AI丨日报

RTE开发者社区

私有化部署的企业级 IM 即时通讯,内部高效沟通

BeeWorks

即时通讯 IM 私有化部署

如何将「语音克隆同意验证机制」嵌入 AI 工作流丨Voice Agent 学习笔记

RTE开发者社区

企业数据资产管理核心框架:L1-L5分层架构解析

袋鼠云数栈

分层架构 数据资产 #数据治理

AI考试系统:用三大技术重构考核的公平与效率

上海拔俗

MemOS Cloud | 云平台快速开始上手教程

记忆张量MemTensor

云服务 MemOS 记忆张量

为什么传统Chatbot搞不定售后,天润融通ZENAVA却能接走一半咨询?

天润融通

从「写代码」到「验代码」:我和 AI 搭档写了三年代码之后

北京中暄互动广告传媒有限公司

大数据-193 Apache Tez 实战:Hive on Tez 安装配置、DAG原理与常见坑

武子康

Apache 大数据 hadoop hive 分布式

企业远控方案如何克服“审计难”和“执行繁”痛点?AI赋能轻松应对

科技经济

Boring Notch:让你的MacBook刘海屏变身音乐控制中心

qife122

macos 刘海屏

格力70多人优化成20人的智能工厂,RFID才是那个隐形功臣

斯科信息

斯科 格力RFID智能工厂 RFID解决方方案

AI大模型爆火的SSE技术到底是什么?万字长文,一篇读懂SSE!

JackJiang

网络编程 websocket 即时通讯 sse Web端即时通讯

让 AI 工作空间更智能:Amazon Quick Suite 集成博查搜索实践

亚马逊云科技 (Amazon Web Services)

人工智能

LLM 扩展方式的三年演进之路:复杂之后,回归简单

Baihai IDP

程序员 AI 大模型 LLM AI Agent

2026年能源管理领域值得关注的5个系统平台

开源能源管理系统

开源 能源管理系统 排名

解析CVE-2025-14022:LINE iOS客户端SSL/TLS证书验证漏洞

qife122

网络安全 移动安全

为什么那么看重代码覆盖率?

禅道项目管理

软件测试 软件开发 代码覆盖率 项目管理软件

YashanDB安全机制深入剖析与实战建议

数据库砖家

2026年最值得关注的5大能源管理系统

开源能源管理系统

开源 能源管理系统 排名

企业级AI开发平台新选择:MonkeyCode如何让开发团队效率与安全兼得?

百川云开发者

开源 AI编程

数据治理与数据资产管控建设方案

金陵老街

资产标签

扣子彻底变了!拥抱 Vibe Coding,不只是智能体!

苍何

IBM UCD 会话管理漏洞详解:CVE-2025-36360 会话过期缺陷技术分析

qife122

网络安全 会话管理

Fluss RoadMap里的ZeroDisk是啥

泊浮目

S3 aws s3 AutoMQ Fluss

保姆级操作指南|如何在火山方舟上构建下一代 Agent 应用?

火山引擎开发者社区

YashanDB备份恢复的自动化实操流程

数据库砖家

天润融通洞察:5%准确率差距,成AI客服Agent上线“生死线”

天润融通

技术创新筑基 生态协同赋能——狄耐克深耕智慧场景书写高质量发展答卷

新消费日报

AI测试的分水岭,正在从“会不会用模型”走向“能不能跑稳系统”

测试人

软件测试

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