InfoQ

新闻

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

作者 Jonathan Allen译者 赵劼 发布于 2007年12月24日 下午9时45分

社区
.NET
主题
性能和可伸缩性
标签
并行计算,
PLINQ

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

没有回复

回复

深度内容

Flex与JSON及XML的互操作

平台需要互操作性。在这篇文章中,作者仔细研究了Flex和JSON及XML的互操作性。文章也包含了使用E4X库来将XML映射到图表和表格组件的内容,还演示了如何使用as3core库来解码JSON消息。

用Qi4j进行面向组合编程

本文将简要介绍面向组合编程(COP,Composite Oriented Programming)的概念,展示它如何规避OOP存在的一些问题,并重新点燃使用可重用部件组装领域模型(Domain Model)的希望。

系统开发——新学科,新教育

一门新的计算机学科——“系统开发”,强调人性化、匠艺、设计、创意、创新和新事物的涌现,并建议用被称为“bottega”的工作室替代乏善可陈的教室。

图书聚焦:Visual Studio 2008 揭秘

Mike Snell和Lars Powers用他们最近由Sams出版的新书《Visual Studio 2008揭秘》,试图帮助大家提高开发人员的生产力。本文包括一个下载样章——第10章调试。

BPEL为何不是BPM的圣杯?

Pierre Vigneras在本文中讨论了作为标准之一的BPEL所存在的问题。Pierre先给我们大致介绍了一个简单的并行流程,接着讨论了从业者在试图以一个结构化模型为基础表达非结构化流程时遇到的一系列问题。

基于范型的多语言编程

你是否仔细思考过,为什么人们总在讨论“要正确的语言做恰当的事情”?在这篇文章中,Sadek Drobi向你解释了为什么应该在系统内部混合使用多种语言。

采访与书摘《Pro Web 2.0 Application Development with GWT》

Jeff Dwyer就关于他的新书(《Pro Web 2.0 Application Development with GWT》)、GWT1.5以及创建可搜索的Ajax应用谈了一些他的见解。

时刻准备着,迎接IT业的春天

我们需要设身处地地为客户及客户的业务本身着想,与客户同舟共济。更多创新的思路、产品和模式也同样将为IT业带来新的出路。IT业并不需要坐以待毙,在春天到来之后,市场将会更加繁荣!