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语言实现多核并行化运行实例的主要内容,如果未能解决你的问题,请参考以下文章

go语言并发编程(高级)

Go语言常见的并发模式

Go语言并发编程简单入门

GO语言的并发Concurrency:Goroutine与通信机制Channel

Go语言之goroutine

go 语言 并发,并行,信道