并发与并行这两个概念是使人困惑的,但在go语言的编程中是必需要理解的。算法
并发(concurrent)编程
并发是指两种或两种以上的行为在系统中同时存在
,至于这两个行为是否在某一时刻同时“执行”,在并发的概念中并不考虑。
在go语言中,go语句能够开启一个新的goroutine,这就典型的并发。不一样的goroutines在程序运行期间可能同时存在着, 至于这些goroutines在某一个时刻是否是同时运行, 咱们不去关心。
事实上, 在单核CPU系统中, goroutines的运转是依赖cpu的时间片轮转算法的,即交替执行。但这的的确确是并发,缘由是系统具有了同时处理多种行为的能力。实际上这是一种人类没法直接感知的“伪并行”,只不过从表面上看来,“像是同时执行的”。并发
并行(parellel)code
并行意味着多个动做在某一时段是同时执行
的。在多核CPU的前提下, go能够为goroutines指定运算须要的处理器数量, 这样的话, goroutines就是真正的并行了,每一个goroutine有独立的CPU为本身运算,而不须要公用一个CPU来轮转运算。程序
对比并行
能够说并发是一个逻辑上的概念,并行是一个物理运行状态的概念。并行是并发的一个“子集”,并发包含并行。goroutine