第十章并行编程
最近并行编程(parallel programming)已经不再是相对较晦涩的主题,由只能是专业开发人员精通,变得更为主流,这是因为日益流行多核处理器。在写作本书的时候,想买一台单核处理器 PC 机,已经几乎不可能,双核已是标配,四核处理器也开始出售,而未来几年内这种趋势还将继续完全在意料之中。
在某些程度上,并行编程中的这种兴趣在带动了函数编程的新的兴趣。函数式编程当然不是所有的并行编程问题最佳解决方案(silver bullet,银色子弹),但它可以有助于设计出以并行方式执行的软件。在本章中,我们将学习一些较简单的技巧,使程序并行运行,以及如何利用多处理器。
把并行编程问题分解成几个更小的主题,往往很有帮助,也正是我们这一章所要做的:
线程、内存、锁定和阻塞(Threads, Memory, Locking, and Blocking):在这里,我们将学习在 .NET 编程中如何创建、控制线程的基础知识,如何在线程之间共享资源(比如内存),如何控制访问这些共享资源;
响应式编程(Reactive programming):程序能够保持对用户输入的响应是体验,因此,应该避免在负责响应用户输入的线程中做太多的处理。这对图形用户界面(GUI)编程特别重要,也同时适用于服务器,因为它需要一直保持响应传入的请求;
数据并行(Data parallelism):即用不同的数据在几个处理器上同时执行一段代码,这是并行化(parallelize)处理大型数据结构,比如集合的好方法。并行地把一个转换应用到集合的几项是可能的,这通常能够提高整体的执行速度。典型的示例是并行映射(parallel map),它是最简单的并行化函数程序的方法之一。
异步编程(Asynchronous programming):有些任务,特别是输入输出,需要异步执行,以提高程序的运行效率。因此,保证在输入输出期间线程不会长时间阻塞,非常重要。
消息传递(Message passing):正式地称为角色模型(actor model)。它是用来协调并行执行的任务,是本章讨论的最先进的并行编程(parallel-programming)主题。
并行编程是一个很大的主题,因此,不是这一章所能说完的,但是,我们力图一种利用 F# 进行并行编程的起步的简单方法。