首页 > 代码库 > 1.4.3.2 使用 PLINQ 的声明式并行
1.4.3.2 使用 PLINQ 的声明式并行
1.4.3.2 使用 PLINQ 的声明式并行
声明式编程风格提供了另一种写并行程序的方法。我们知道,用声明式写代码,就是进行基元组成。在 LINQ 中,这些基元是查询运算符,比如 where 和 select。使用声明式风格,我们可以很容易替换基元的实现,PLINQ 就是这样做的:我们能够用并行的查询运算符替换标准查询运算符。
清单 1.9 是一个查询,更新虚拟游戏中的所有怪物,并删除上一步中死掉的怪物。[ 并行化的]改变非常简单,因此,我们可以用一个清单展示两个版本。
Listing 1.9 Parallelizing data processingcode using PLINQ (C#)
var updated = from m in monsters let nm = m.PerformStep() where nm.IsAlive select nm; | var updated = from m in monsters.AsParallel() [1] let nm = m.PerformStep() where nm.IsAlive select nm; |
在右侧的并行版本中,我们所做的唯一改变是添加了调用 AsParallel 方法[1],这个调用改变了查询运行时的基元,并使整段代码得以并行。在第十二章,我们将会看到其工作原理,并讨论声明式计算,第十四章重点关注并行式程序设计。
你可能会想,我们在程序中并不常用 LINQ 查询。绝对正确,因为在命令式程序中,LINQ 查询很少用;但是,在函数程序中,大都使用声明式风格处理数据。在 C# 中,可以写查询表达式,而F# 则提供了高阶列表处理函数(我们将在第五章和第六章所看到)。这意味着,你读过本书以后,在处理数据的时候,就可以更多地使用声明式编程,这样,你的程序将更容易实现并行化。
我们已经介绍了两种方法,能够用来简化函数式编程的并行化,这也是函数式思想在今天非常受人关注的原因之一,在第十三章和第十四章,我们还要再讨论这个问题以及相关主题。
在开始讨论真正的函数式程序之前,我们需要了解一下 F# 这种语言,首先看一下经典的 Hello world 程序,以及 F# 中的工具。下面一节将简要介绍开发 F# 解决方案的典型过程。