当前位置 博文首页 > golang中的并发和并行

    golang中的并发和并行

    作者:盼盼编程 时间:2021-05-29 17:54

    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 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)
    }
    

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

    js
    下一篇:没有了