您好,登錄后才能下訂單哦!
這篇文章主要介紹了golang中并發(fā)和并行的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
golang 是Google開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能。
golang中默認(rèn)使用一個CPU,這時程序無法并發(fā),只能是并發(fā)。因?yàn)槭冀K只有一個CPU在運(yùn)行。
package main import ( "fmt" "runtime" ) //并發(fā)和并行 var quit chan int = make(chan int) func loop() { for i := 0; i < 100; i++ { //為了觀察,跑多些 fmt.Printf("%d ", i) } quit <- 0 } func main() { runtime.GOMAXPROCS(2) // 最多使用2個核 go loop() go loop() for i := 0; i < 2; i++ { <- quit } }
runtime.GOMAXPROCS(2) 設(shè)置使用2個CPU,這才真正是并行。
補(bǔ)充:Go多核并行化
通過goroutine創(chuàng)建相同邏輯CPU核心個數(shù)的協(xié)程,將求和列表分段,分別計(jì)算后匯總。
通過runtime.NUMCPU()獲得邏輯CPU個數(shù),并計(jì)算每個協(xié)程中計(jì)算列表的下標(biāo),計(jì)算完成后,向channel中寫入1。
通過向channel中讀取int的個數(shù),判斷協(xié)程運(yùn)行是否全部完成,之后求和即可。
package main import ( "fmt" "runtime" ) type Vector []float64 func (v Vector) DoSome(p, i, n int, u Vector, c chan int) { sum := 0.0 for ; i < n; i++ { sum += u[i] } v[p] = sum c <- 1 } const NCPU = 4 func (v Vector) DoAll(u Vector) { c := make(chan int, NCPU) for i := 0; i < NCPU; i++ { fmt.Println(i, i*len(u)/NCPU, (i+1)*len(u)/NCPU) go v.DoSome(i, i*len(u)/NCPU, (i+1)*len(u)/NCPU, u, c) } for i := 0; i < NCPU; i++ { <-c } sum := 0.0 for _, value := range v { sum += value } fmt.Println(sum) } func main() { u := make([]float64, 64) for i := 0; i < 64; i++ { u[i] = float64(i) } var v Vector = make([]float64, NCPU) v.DoAll(u) ncpu := runtime.NumCPU() fmt.Println(ncpu) }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“golang中并發(fā)和并行的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。