區分「併發」與「並行」的概念

併發與並行這兩個概念是使人困惑的,但在go語言的編程中是必需要理解的。算法

併發(concurrent)編程

併發是指兩種或兩種以上的行爲在系統中同時存在,至於這兩個行爲是否在某一時刻同時「執行」,在併發的概念中並不考慮。
在go語言中,go語句能夠開啓一個新的goroutine,這就典型的併發。不一樣的goroutines在程序運行期間可能同時存在着, 至於這些goroutines在某一個時刻是否是同時運行, 咱們不去關心。
事實上, 在單核CPU系統中, goroutines的運轉是依賴cpu的時間片輪轉算法的,即交替執行。但這的的確確是併發,緣由是系統具有了同時處理多種行爲的能力。實際上這是一種人類沒法直接感知的「僞並行」,只不過從表面上看來,「像是同時執行的」。併發

並行(parellel)code

並行意味着多個動做在某一時段是同時執行的。在多核CPU的前提下, go能夠爲goroutines指定運算須要的處理器數量, 這樣的話, goroutines就是真正的並行了,每一個goroutine有獨立的CPU爲本身運算,而不須要公用一個CPU來輪轉運算。程序

對比並行

能夠說併發是一個邏輯上的概念,並行是一個物理運行狀態的概念。並行是併發的一個「子集」,併發包含並行。goroutine

相關文章
相關標籤/搜索