您的位置:首页技术文章

golang中的并发和并行

【字号: 日期:2023-10-13 16:49:45浏览:33作者:馨心

golang中默认使用一个CPU,这时程序无法并发,只能是并发。因为始终只有一个CPU在运行。

package main import ( 'fmt' 'runtime') //并发和并行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) 设置使用2个CPU,这才真正是并行。

补充:Go多核并行化

通过goroutine创建相同逻辑CPU核心个数的协程,将求和列表分段,分别计算后汇总。

通过runtime.NUMCPU()获得逻辑CPU个数,并计算每个协程中计算列表的下标,计算完成后,向channel中写入1。

通过向channel中读取int的个数,判断协程运行是否全部完成,之后求和即可。

package mainimport ('fmt''runtime')type Vector []float64func (v Vector) DoSome(p, i, n int, u Vector, c chan int) {sum := 0.0for ; i < n; i++ {sum += u[i]}v[p] = sumc <- 1}const NCPU = 4func (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.0for _, 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)}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持优爱好网。如有错误或未考虑完全的地方,望不吝赐教。

标签: Golang
相关文章: