package main import ( "fmt" ) func main() { for i := 0; i < 5; i++ { go AsyncFunc(i) } } func AsyncFunc(index int) { sum := 0 for i := 0; i < 10000; i++ { sum += 1 } fmt.Printf("线程%d, sum为:%d\n", index, sum) }运行结果如下:
线程0, sum为:10000
线程2, sum为:10000
线程3, sum为:10000
线程1, sum为:10000
线程4, sum为:10000
type Vector []float64 // 分配给每个CPU的计算任务 func (v Vector) DoSome(i, n int, u Vector, c chan int) { for ; i < n; i++ { v[i] += u.Op(v[i]) } c <- 1 // 发信号告诉任务管理者我已经计算完成了 } const NCPU = 16 // 假设总共有16核 func (v Vector) DoAll(u Vector) { c := make(chan int, NCPU) // 用于接收每个CPU的任务完成信号 for i := 0; i < NCPU; i++ { go v.DoSome(i*len(v)/NCPU, (i+1)*len(v)/NCPU, u, c) } // 等待所有CPU的任务完成 for i := 0; i < NCPU; i++ { <-c // 获取到一个数据,表示一个CPU计算完成了 } // 到这里表示所有计算已经结束 }这两个函数看起来设计非常合理,其中 DoAll() 会根据 CPU 核心的数目对任务进行分割,然后开辟多个 goroutine 来并行执行这些计算任务。
runtime.GOMAXPROCS(16)
到底应该设置多少个 CPU 核心呢,其实 runtime 包中还提供了另外一个 NumCPU() 函数来获取核心数,示例代码如下:package main import ( "fmt" "runtime" ) func main() { cpuNum := runtime.NumCPU() //获得当前设备的cpu核心数 fmt.Println("cpu核心数:", cpuNum) runtime.GOMAXPROCS(cpuNum) //设置需要用到的cpu数量 }运行结果如下:
cpu核心数: 4
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有