首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GO语言实现多核并行化运行实例

并行是指两个或者多个事件在同一时刻发生,能否在go语言中实现并行运行,以提高计算机的利用效率呢,答案是可能的,首先我们先设计一段程序,运行10次1到100000000的和。一般的代码如下(以图示为准):

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秒。其实,只是简单的加法还不能完成完全体现出多核并行的优越性,希望能在后续的文章中继续论述。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180323A1U1TM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券