为什么Go语句不并行执行?

时间:2011-06-04 07:03:32

标签: multicore go parallel-processing

我正在我的VirtualBoxed Ubuntu 11.4上测试这个Go代码

package main

import ("fmt";"time";"big")
var c chan *big.Int

func sum( start,stop,step int64) {
    bigStop := big.NewInt(stop)
    bigStep := big.NewInt(step)
    bigSum  := big.NewInt(0)
    for i := big.NewInt(start);i.Cmp(bigStop)<0 ;i.Add(i,bigStep){
        bigSum.Add(bigSum,i)
    }
    c<-bigSum           
}

func main() {
    s := big.NewInt( 0 )
    n := time.Nanoseconds()

    step := int64(4)
    c = make( chan *big.Int , int(step))
    stop := int64(100000000)
    for j:=int64(0);j<step;j++{
        go sum(j,stop,step)     
    }
    for j:=int64(0);j<step;j++{
        s.Add(s,<-c)
    }
    n = time.Nanoseconds() - n
    fmt.Println(s,float64(n)/1000000000.)
}

Ubuntu可以访问我的所有4个核心。我通过同时运行几个可执行文件和系统监视器来检查这个。 但是,当我尝试运行此代码时,它只使用一个核心,并没有获得并行处理的任何利润。

我做错了什么?

1 个答案:

答案 0 :(得分:24)

您可能需要查看Concurrency section of the Go FAQ,特别是这两个问题,并确定哪些(如果不是两者)适用于您的案例:

  

为什么我的多goroutine程序没有   使用多个CPU?

     

您必须设置GOMAXPROCS shell环境   变量或使用类似命名的function   允许运行时的运行时包   支持使用多个OS线程。

     

执行并行计算的程序   应该受益于GOMAXPROCS的增加。   但请注意concurrency is not parallelism

     

为什么使用GOMAXPROCS&gt; 1   有时让我的程序变慢?

     

这取决于你的性质   程序。包含多个的程序   花了很多时间的goroutines   在频道上进行沟通   体验性能下降   使用多个OS线程时这个   是因为重要的   涉及的上下文切换惩罚   在线程之间发送数据。

     

Go的goroutine调度程序不是   好的,因为它需要。将来,它   应该承认这种情况和   优化其对OS线程的使用。对于   现在,GOMAXPROCS应该设置为   每个应用程序。

     

有关此主题的更多详细信息,请参阅   题为Concurrency is not Parallelism的讨论。

相关问题