并发编程简介

Performance is a Feature.

性能一直是软件开发不断追求的目标,因为没有人喜欢和一个缓慢的系统或者应用打交道。 有很多研究都会告诉你,如果网站的响应速度越慢,用户的满意度也就越低,更多用户也会 因此选择其他产品。

在软件开发领域,提高性能有两种方法:购买更多的硬件,和充分利用已有硬件的计算能力。 两者都是有效的手段,并没有本质上的优劣之分。我们经常能听到,在业务快速发展的阶段, 公司为此大肆购买服务器的事情,这是很多互联网公司的标准做法。购买服务器并不是没有技术 含量的事情,维护服务器集群、保证程序逻辑能够无限水平扩展需要非常复杂的技术。

因为摩尔定律的存在,每过一段时间,硬件性能的性能就会翻翻,同时硬件的价格还会降低。 对于程序来说,每过一段时间,它就能运行在更快 CPU 和 内存、更快更多硬盘的机器上, 可以说,程序的性能会随着时间自动提高。

但是进入到后摩尔定律时代,硬件的性能不再快速提高,价格也不再快速下降,我们也就不能 继续享受免费的午餐。基于此,充分利用硬件的计算能力这个方法变得越来越重要,而并发 编程就是实现这一目标的最有效手段。

换一个角度来说,编程一直都是对现实世界的描述和模拟。过程式编程可以看做我们思考问题和 解决问题的步骤的模拟;面向对象编程可以看做对现实世界物体状态和行为的模拟。 而现实世界是并发运行的:每个生物都同时存在,有独立的行为; 国家之间虽然有巨大差异,但也是互相同时运行良好; 经济行为都是频繁并快速地同时发生……当然,小的个体也会有等待和阻塞,比如去买咖啡要排队、 驾驶汽车会堵车、处理事务需要等待审核等等。但是并发才是常态,这些都是异常的不希望的行为。 而且我们还会在等待的时候做其他事情,比如排队的时候和朋友聊天或者刷手机、堵车的时候听听 音乐、等待审核期间去忙工作等,减少等待行为造成的时间浪费。

因此作为对世界的模拟,程序追求并发运行本身就是非常合理的事情。

并发与并行

在编程领域,有时候我们需要区分并发(concurrency)和并行(parallel)的概念。

并行强调的是在同一时间有多个实体在运行,比如代码运行在不同的 CPU 上; 而并发是指同时管理多个任务,并不要求这些任务同时在执行。

Parallelism is about doing a lot of things at once. Concurrency is about managing a lot of things at one.

举个生活中的例子,我们每天有很多事情要处理:接发邮件、开会、撰写文稿…… 我们会说自己同时忙很多事情,但具体到每个时间点,我们只能在做其中一件事情,只是在它们之间 不断切换,这就是并发;公司举办派对,找来很多同事来布置,有些人贴横幅、有些人预定食物、 有些人准备气球,这些事情都是同时进行的,这就是并行。

并发和并行的区别在很多情况下并不需要严格区分,在本书中,如果没有特意说明,我们统一使用并发这个词。

go 语言和并发编程

go 语言在设计之初就把性能作为很重要的目标,它不仅能让我们更快速地编写代码,也能快速编译代码,还希望 最终的程序运行效率很高。因为对性能的追求,go 把并发实现成了语言本身的特性,这也成为了吸引很多 程序员和公司的一大亮点。

go 语言对并发的支持,让快速开发正确的并发程序变得容易。但这个容易只是相对而言, 相对其他语言和之前的开发过程,要想真正掌握并发编程,我们还是需要深入了解 go 提供的语法和功能、 认真设计程序的逻辑和行为。

这本书就针对 go 语言并发编程这一话题进行深入探讨,希望能帮助大家解锁 go 并发的威力, 有效地开发出性能更好的程序。

Last updated