你好,我是全新的去(和一般:(并发编程),并试图以一个缓慢的计算分配到工人的游泳池。转到工作池似乎并没有被同时处理
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
均匀地通过所有的数字整除的最小数目。
我创建了工人的游泳池,我把他们的值,直到够程的人们发现了许多C一个均匀地通过所有的数字中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)
缓冲值
,并希望有人能看到的问题是什么。我希望我添加的工人越多,计算速度就越快,但我没有经历过。我敢肯定,我的“M缺少一些关键的概念,
谢谢
您对GOMAXPROCS的设置是什么? – JimB
当GOMAXPROCS为1时,goroutine更像线程而不是进程,因此单个CPU内核无法获得更多速度。当你有一些阻塞的I/O但是对你的代码没有帮助时,这很有用。增加GOMAXPROCS应该有所帮助,因为go运行时将会跨多个进程拆分goroutine。 – TheHippo
处理器或流程@TheHippo?他们有点不同:P –