第十四章 并行函数程序
本章介绍
■ 用不可变数据简化并行化(parallelization)
■ 处理任务并行库(Task Parallel library)
■ 用 LINQ 以声明方式表达并行度(parallelism)
■ 实现重载(overloaded)运算符
赞成函数式编程的论据,我们已经看到许多。原因之一就是,并行度现在变得越来越重要。写可以适应大量核心的代码,与使用典型的命令式方法相比较,以函数风格容易得多的。
来自函数世界的两个概念是本质,并行计算是声明性的编程风格,使用不可变的数据结构,这两者密切相关。当使用不可变的数据时,代码变得更具声明性,因为,这样的代码更关心预期的计算结果,而不是复制和改变数据的细节。两个概念都很重要,是以不同的方式达到并行化。
使用声明风格,大部分代码可以很容易并行处理集合,因为声明风格不描述代码如何运行,这样,不费什么劲,就能用并行替换串行。不可变的数据结构和无副作用的函数是重要的,因为代码没有副作用,我们可以轻松地确定哪些代码不相互依赖。做到了这一点,就可以使用基于任务的并行度以并行方式运行代码段。C# 和 F# 都可以使用可变的数据类型,在第十章,我们学习过如何隐藏可变状态,使整个程序成为函数式。在某些情况下,例如,以某种方式处理数组,这种隐藏命令隔离的代码,也可以很容易实现并行化。
可以发现,值得研究的内容很多。我们首先简要演示所有这些技术,并解释每一个的用途。之后,看两个更复杂的示例应用程序,展示用并行函数式编程处理大规模应用。我们无法在一章中容纳两个完整的实际示例的代码,在书中,会省略一些意义不大的细节;我们会特别关注架构方面,直接与并行相关的领域。从本书的网站可以获取完整的源代码,其中补充了缺少的部分。