Rob Pike:并发并非并行
速览
Rob Pike在一段视频中深入解析并发(Concurrency)与并行(Parallelism)的概念,指出两者常被混淆但本质不同。并发是程序结构的设计,而并行是执行时的特性。这一观点对理解现代编程架构有重要意义。
AI 深度解读
背景
2012 年,Rob Pike 在 Heroku Waza 大会上发表了题为“Concurrency Is Not Parallelism”的演讲。作为 Go 语言的共同设计者之一,Pike 希望澄清软件开发中两个常被混用的概念——并发(Concurrency)与并行(Parallelism)。他认为,对这两个概念的混淆会导致错误的系统设计,尤其是在多核处理器普及的时代。Hacker News 上发布的该演讲视频至今仍是理解并发本质的经典资源,引发广泛讨论。
核心内容
Pike 用一个简单的比喻开场:并发是关于如何处理多个事情(structure),而并行是关于如何同时执行多个事情(execution)。他随后展示了两个关键定义:
- 并发:程序的结构方式,使得多个独立执行的任务可以互相通信、协调工作。它关注的是任务的分解与组合。
- 并行:通过利用多核 CPU 或多处理器,在物理上同时执行多个计算。它关注的是性能的提升。
Pike 强调,并发不一定需要并行。一个程序可以用并发方式设计(比如使用 goroutine 和 channel 进行异步通信),但若运行在单核处理器上,它仍然是并发而非并行。反过来,并行也可以在没有良好并发结构的情况下实现(例如线程池中无协调的粗粒度任务),但这种并行往往难以扩展。
他用 Go 语言中的例子深入说明:将一个大任务拆分成多个独立的小任务(goroutine),并通过 channel 在这些任务之间传递数据,形成清晰的通信顺序进程(CSP)模型。这种结构让程序更容易理解、测试和维护,而并行只是它可能带来的性能副产物。
演讲中还引用了一个著名的类比:并发是设计一个移动玩具(比如用多个齿轮协同工作),而并行是让两个玩具同时移动。他展示了两个实际的 Go 程序——一个用并发设计,另一个用简单并行——来说明前者在处理复杂交互时更优雅、更不易出错。
关键要点
- 并发是程序结构问题,并行是执行模式问题。
- 并发并不天然意味着更快,它首先是为了组织和清晰。
- 并行可以没有并发(例如无关联的纯并行计算),但好的并发设计往往能更容易地实现并行。
- Go 语言的 goroutine 和 channel 是表达并发组合的工具,而非并行执行机制。
- 在多核时代,先关注并发结构,再考虑并行优化,才是正确的工程思路。
- Pike 批评了许多开发者误将“使用多线程”等同于“实现并发”,实际上线程只是并发的一种底层实现手段。
- 演讲末尾强调:并发优于并行,因为它是关于“什么需要同时发生”,而不是“如何同时发生”。
意义与影响
这场演讲深刻影响了软件工程界对并发编程的理解。在当时(2012 年),多数开发者将并发与并行混为一谈,认为只要加锁、用线程池就能利用多核。Pike 的辨析推动了 CSP 模型在 Go 语言中的流行,并且间接影响了其他语言(如 Rust 的 async/await、Erlang 的 actor 模型)对并发抽象的设计。
对于现代系统——无论是 Web 服务器、分布式数据库还是实时数据管道——正确区分并发与并行已成为基本功。Pike 的观点也提醒工程师:单纯追求并行(如盲目增加线程数)常常导致复杂度飙升和性能下降,而从并发结构入手则能带来可维护性和可扩展性。
该视频至今在 Hacker News、YouTube 等平台常被重提,成为每一位想深入理解并发编程的开发者的入门必读内容。
