golang中默認(rèn)使用一個CPU,這時程序無法并發(fā),只能是并發(fā)。因為始終只有一個CPU在運行。
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,這才真正是并行。
補充:Go多核并行化
通過goroutine創(chuàng)建相同邏輯CPU核心個數(shù)的協(xié)程,將求和列表分段,分別計算后匯總。
通過runtime.NUMCPU()獲得邏輯CPU個數(shù),并計算每個協(xié)程中計算列表的下標(biāo),計算完成后,向channel中寫入1。
通過向channel中讀取int的個數(shù),判斷協(xié)程運行是否全部完成,之后求和即可。
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) }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
標(biāo)簽:欽州 汕頭 重慶 銅川 吐魯番 梅河口 蘭州 雞西
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang中的并發(fā)和并行》,本文關(guān)鍵詞 golang,中的,并發(fā),和,并行,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。