Haskell 并行与并发编程入门
1. 背景与挑战
长期以来,编程界都深知使用线程和锁进行编程是一项极具挑战性的任务。即使是解决简单的问题,也往往需要相当高的专业知识,而且编写出来的程序还容易出现难以诊断的错误。尽管如此,线程和锁具有足够的通用性,能够表达从并行图像处理器到并发 Web 服务器等各种程序的需求,拥有一个通用的 API 无疑是有好处的。
然而,如果我们想让并发和并行软件开发变得更容易,就必须认识到不同的问题需要不同的工具,单一的工具是不够的。例如,图像处理自然地适合用并行数组操作来表达,而线程则更适合用于并发 Web 服务器。
2. Haskell 的解决方案
在 Haskell 中,我们致力于为尽可能多的任务提供合适的工具。如果发现某个任务没有合适的工具,我们就会尝试开发它。这种多样性带来的必然缺点是需要学习的内容很多,但这也正是我们要探讨的核心。
我们将讨论如何在 Haskell 中编写并行和并发程序,涵盖从简单地利用并行性加速计算密集型程序,到使用轻量级线程编写高速并发网络服务器等多个方面。此外,我们还会介绍如何使用 Haskell 编写在现代图形卡(GPU)强大处理器上运行的程序,以及如何编写能在网络中多台机器上运行的分布式程序。
3. 聚焦稳定可用的 API
需要说明的是,我们不会涵盖所有新兴的实验性编程模型。如果你查看 Hackage 上的软件包,会发现有各种各样用于并行和并发编程的库,其中很多是为满足特定需求而构建的,更不用说还有许多尚未准备好用于实际生产的研究项目。在本文中,我们将重点关注那些目前可以使用并且在生产环境中足够稳定可靠的 API。