1 package main
2 import (
3 "fmt"
4 )
5 func main() {
6 for i := 0; i
7 Go(i)
8 }
9 }
10 func Go(index int) {
11 a := 1
13 a += i
14 }
15 fmt.Println(index, a)
16 }
上例子中,主函数调用GO(i)10次,每次调用都输出一次求和的值,达到我们程序的要求,程序及输出结果如下,运行时间4.4999406秒。
图1
为了使程序能多核并行执行,我们需要判断计算机的核数,我们可以先通过设置环境变量GOMAXPROCS的值来控制使用多少个CPU核心。具体操作方法是通过直接设置环境变量GOMAXPROCS的值,或者在代码中启动goroutine之前先调用以下这个语句以设置使用CPU核心:
runtime.GOMAXPROCS()
到底应该设置多少个CPU核心呢,其实runtime包中还提供了另外一个函数NumCPU()来获取核心数。可以利用这些信息将goroutine调度到所有CPU核心上,从而最大化地利用服务器的多核计算能力。为了实现程序的要求,我们还需要用信道来控制输出的值,在信道里,引入10个缓冲值:当10个值全部传递完成后,关闭主程序:看下面的代码(代码以截图为准):
1 package main
2 import (
3 "fmt"
4 "runtime"
5 )
6 func main() {
7 runtime.GOMAXPROCS(runtime.NumCPU())
8 fmt.Println(runtime.NumCPU())
9 c := make(chan bool, 10)
10 for i := 0; i
11 go Go(c, i)
12 }
13 for i := 0; i
14
15 }
16 }
17 func Go(c chan bool, index int) {
18 a := 1
20 a += i
21 }
22 fmt.Println(index, a)
23 c
24 }
看看运行结果如何呢?
图2
首先输出了计算机的核数4,然后输出了10次运算结果,由于是不同的Goroutine,,完成的时间不同,所以,输出的结果不是按顺序进行的。总的运算时间好像没有我们期望的那么短吧,是2.8373536秒。其实,只是简单的加法还不能完成完全体现出多核并行的优越性,希望能在后续的文章中继续论述。
分享成果,随喜正能量
领取专属 10元无门槛券
私享最新 技术干货