golang中默認使用一個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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- 關(guān)于golang高并發(fā)的實現(xiàn)與注意事項說明
- 基于Golang 高并發(fā)問題的解決方案
- 使用golang編寫一個并發(fā)工作隊列
- golang 并發(fā)編程之生產(chǎn)者消費者詳解
- Golang 并發(fā)以及通道的使用方式
- 快速解決Golang Map 并發(fā)讀寫安全的問題
- 淺談golang并發(fā)操作變量安全的問題