你好,我是一个全新的(和并发编程一般:(),并试图将缓慢的计算分配给一群工人。
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)
缓冲区值
我整天盯着这一天,希望有人能看出问题所在。我希望我添加的工作人员越多,计算速度越快,但没有经历过。我确定我错过了一些关键概念,
谢谢
答案 0 :(得分:1)
http://golang.org/doc/effective_go.html#parallel
默认情况下,Go运行时的当前实现不会并行化此代码。它仅将单个核心专用于用户级处理。系统调用中可以阻止任意数量的goroutine,但默认情况下,只有一个可以随时执行用户级代码。它应该更智能,有一天它会变得更聪明,但是如果你想要CPU并行性,你必须告诉运行时你想要同时执行代码的goroutine有多少。有两种相关的方法可以做到这一点。使用设置为要使用的核心数的环境变量GOMAXPROCS运行您的作业,或者导入运行时包并调用runtime.GOMAXPROCS(NCPU)。一个有用的值可能是runtime.NumCPU(),它报告本地计算机上的逻辑CPU数。同样,随着调度和运行时间的改进,预计此要求将被淘汰。