go

区分“并发”与“并行”的概念

Posted by Ethan Blog on November 11, 2019

并发与并行这两个概念是令人困惑的,但在go语言的编程中是必须要理解的。

1
	并发(concurrent)

并发是指两种或两种以上的行为在系统中同时存在,至于这两个行为是否在某一时刻同时“执行”,在并发的概念中并不考虑。
在go语言中,go语句可以开启一个新的goroutine,这就典型的并发。不同的goroutines在程序运行期间可能同时存在着, 至于这些goroutines在某一个时刻是不是同时运行, 我们不去关心。 事实上, 在单核CPU系统中, goroutines的运转是依赖cpu的时间片轮转算法的,即交替执行。但这的的确确是并发,原因是系统具备了同时处理多种行为的能力。实际上这是一种人类无法直接感知的“伪并行”,只不过从表面上看来,“像是同时执行的”。

1
	并行(parellel)

并行意味着多个动作在某一时段是同时执行的。在多核CPU的前提下, go可以为goroutines指定运算需要的处理器数量, 这样的话, goroutines就是真正的并行了,每个goroutine有独立的CPU为自己运算,而不需要公用一个CPU来轮转运算。

对比

可以说并发是一个逻辑上的概念,并行是一个物理运行状态的概念。并行是并发的一个“子集”,并发包含并行。

转载自segmentfault