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)文章
使用go net實(shí)現(xiàn)簡(jiǎn)單的redis通信協(xié)議
本文主要介紹了go net實(shí)現(xiàn)簡(jiǎn)單的redis通信協(xié)議,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Golang使用pprof和trace進(jìn)行診斷和修復(fù)性能問題
在?Go?中,開發(fā)人員可以使用強(qiáng)大的內(nèi)置工具來幫助診斷和修復(fù)性能問題,其中兩個(gè)工具是?pprof?和?trace?包,下面就跟隨小編一起來了解下如何使用pprof和trace進(jìn)行診斷和修復(fù)性能問題吧2024-01-01
使用Go和Tesseract實(shí)現(xiàn)驗(yàn)證碼識(shí)別的流程步驟
驗(yàn)證碼主要用于區(qū)分人類用戶和機(jī)器程序,Tesseract 是一個(gè)開源的光學(xué)字符識(shí)別(OCR)引擎,支持多種語言和字體,并具有較高的識(shí)別準(zhǔn)確率,它由 Google 維護(hù),并且可以通過多種編程語言調(diào)用,本文給大家介紹了使用Go和Tesseract實(shí)現(xiàn)驗(yàn)證碼識(shí)別的流程步驟2025-01-01

