golang中的并發(fā)和并行
golang中默認(rèn)使用一個(gè)CPU,這時(shí)程序無法并發(fā),只能是并發(fā)。因?yàn)槭冀K只有一個(gè)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個(gè)核 go loop() go loop() for i := 0; i < 2; i++ { <- quit } }
runtime.GOMAXPROCS(2) 設(shè)置使用2個(gè)CPU,這才真正是并行。
補(bǔ)充:Go多核并行化
通過goroutine創(chuàng)建相同邏輯CPU核心個(gè)數(shù)的協(xié)程,將求和列表分段,分別計(jì)算后匯總。
通過runtime.NUMCPU()獲得邏輯CPU個(gè)數(shù),并計(jì)算每個(gè)協(xié)程中計(jì)算列表的下標(biāo),計(jì)算完成后,向channel中寫入1。
通過向channel中讀取int的個(gè)數(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) }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
golang之tcp自動(dòng)重連實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猤olang之tcp自動(dòng)重連實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06go語言的panic和recover函數(shù)用法實(shí)例
今天小編就為大家分享一篇關(guān)于go語言的panic和recover函數(shù)用法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04詳解golang中的結(jié)構(gòu)體編解碼神器Mapstructure庫
mapstructure是GO字典(map[string]interface{})和Go結(jié)構(gòu)體之間轉(zhuǎn)換的編解碼工具,這篇文章主要為大家介紹一下Mapstructure庫的相關(guān)使用,希望對大家有所幫助2023-09-09Golang import 導(dǎo)入包語法及一些特殊用法詳解
這篇文章主要介紹了Golang import 導(dǎo)入包語法及一些特殊用法,需要的朋友可以參考下2020-02-02Golang實(shí)現(xiàn)秒讀32GB大文件示例步驟
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)秒讀32GB大文件的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12詳解Golang如何優(yōu)雅接入多個(gè)遠(yuǎn)程配置中心
這篇文章主要為大家為大家介紹了Golang如何優(yōu)雅接入多個(gè)遠(yuǎn)程配置中心詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05