关于并发和并行的区别,引用一个经典的描述:
并发是同一时间应对(dealing with)多件事情的能力。 并行是同一时间动手(doing)做多件事情的能力。
雨痕老师《Go 语言学习笔记》上的解释:
并发是指逻辑上具备同时处理多个任务的能力;并行则是物理上同时执行多个任务。
而根据《Concurrency in Go》这本书,计算机的概念都是抽象的结果,并发和并行也不例外。它这样描述并发和并行的区别:
Concurrency is a property of the code; parallelism is a property of the running program.
并发是代码的特性,并行是正在运行的程序的特性。先忽略我拙劣的翻译。很新奇,不是吗?我也是第一次见到这样的说法,细想一下,还是很有道理的。
我们一直说写的代码是并发的或者是并行的,但是我们能提供什么保证吗?如果在只有一个核的机器上跑并行的代码,它还能并行吗?你就是再天才,也无法写出并行的程序。充其量也就是代码上看起来“并发”的,如此而已。
当然,表面上看起来还是并行的,但那不过 CPU 的障眼法,多个线程在分时共享 CPU 的资源,在一个粗糙的时间隔里看起来就是“并行”。
所以,我们实际上只能编写“并发”的代码,而不能编写“并行”的代码,而且只是希望并发的代码能够并行地执行。并发的代码能否并行,取决于抽象的层级:代码里的并发原语、runtime,操作系统(虚拟机、容器)。层级越来越底层,要求也越来越高。因此,我们谈并发或并行实际上要指定上下文,也就是抽象的层级。