Go Worker Pool似乎没有同时处理

时间:2015-07-19 22:51:27

标签: concurrency go

你好,我是一个全新的(和并发编程一般:(),并试图将缓慢的计算分配给一群工人。

http://play.golang.org/p/lTv4Tm75A4

func main() {
    test := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    answer := getSmallestMultiple(test)
    fmt.Println(answer)
}

我试图找到可以被test中的所有数字整除的最小数字。

我已经创建了一个工作池并且正在向它们发送值,直到其中一个goroutines找到一个可以被test中的所有数字均分的数字

for w := 0; w < 100; w++ {
    go divisibleByAllNumbers(&numbers, jobs, answer)
}


go func() {
    for i := max; ; i += max {
        fmt.Printf("Sending # %d\n", i)
        jobs <- i
    }
}() 

尽管我开始有多少工人,但程序似乎以相同的速度运行。我已经尝试了很多工作,并且它总是需要相同的秒数才能运行,这似乎根本没有同时完成工作。

每个工作人员正在使用range

从队列中消耗工作
for j := range jobs {}

我希望通过jobs频道消耗的进程越多,程序执行的速度就越快。

我还尝试了jobs := make(chan int)缓冲区值

的不同值

我整天盯着这一天,希望有人能看出问题所在。我希望我添加的工作人员越多,计算速度越快,但没有经历过。我确定我错过了一些关键概念,

谢谢

1 个答案:

答案 0 :(得分:1)

http://golang.org/doc/effective_go.html#parallel

默认情况下,Go运行时的当前实现不会并行化此代码。它仅将单个核心专用于用户级处理。系统调用中可以阻止任意数量的goroutine,但默认情况下,只有一个可以随时执行用户级代码。它应该更智能,有一天它会变得更聪明,但是如果你想要CPU并行性,你必须告诉运行时你想要同时执行代码的goroutine有多少。有两种相关的方法可以做到这一点。使用设置为要使用的核心数的环境变量GOMAXPROCS运行您的作业,或者导入运行时包并调用runtime.GOMAXPROCS(NCPU)。一个有用的值可能是runtime.NumCPU(),它报告本地计算机上的逻辑CPU数。同样,随着调度和运行时间的改进,预计此要求将被淘汰。