GO语言实现多核并行化运行实例
Posted VBA语言专家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GO语言实现多核并行化运行实例相关的知识,希望对你有一定的参考价值。
并行是指两个或者多个事件在同一时刻发生,能否在go语言中实现并行运行,以提高计算机的利用效率呢,答案是可能的,首先我们先设计一段程序,运行10次1到100000000的和。一般的代码如下(以图示为准):
1 package main
2 import (
3 "fmt"
4 )
5 func main() {
6 for i := 0; i<10;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<10;i++{
11 go Go(c, i)
12 }
13 for i := 0; i<10;i++{
14 <-c
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秒。
其实,只是简单的加法还不能完全体现出多核并行的优越性,希望能在后续的文章中继续论述。
相关阅读
以上是关于GO语言实现多核并行化运行实例的主要内容,如果未能解决你的问题,请参考以下文章