• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang中的并发和并行

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

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

    您可能感兴趣的文章:
    • 关于golang高并发的实现与注意事项说明
    • 基于Golang 高并发问题的解决方案
    • 使用golang编写一个并发工作队列
    • golang 并发编程之生产者消费者详解
    • Golang 并发以及通道的使用方式
    • 快速解决Golang Map 并发读写安全的问题
    • 浅谈golang并发操作变量安全的问题
    上一篇:关于golang高并发的实现与注意事项说明
    下一篇:golang 实现并发求和
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang中的并发和并行 golang,中的,并发,和,并行,