2015-07-19 77 views
-1

你好,我是全新的去(和一般:(并发编程),并试图以一个缓慢的计算分配到工人的游泳池。转到工作池似乎并没有被同时处理

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缺少一些关键的概念,

谢谢

+5

您对GOMAXPROCS的设置是什么? – JimB

+0

当GOMAXPROCS为1时,goroutine更像线程而不是进程,因此单个CPU内核无法获得更多速度。当你有一些阻塞的I/O但是对你的代码没有帮助时,这很有用。增加GOMAXPROCS应该有所帮助,因为go运行时将会跨多个进程拆分goroutine。 – TheHippo

+0

处理器或流程@TheHippo?他们有点不同:P –

回答

1

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

当前实现Go运行时不进行并行默认情况下此代码。它致力于只有一个核心,以用户级别的处理任意数量的goroutines可以在系统调用中被阻塞,但是默认情况下只有一个可以在任何时候执行用户级的代码,它应该更聪明,有一天它会更聪明,但直到它是如果你想要CPU的并行性,你必须告诉运行时需要同时执行多少个goroutines。有两种相关的方法可以做到这一点:或者用环境变量GOMAXP ROCS设置为要使用的核心数量或导入运行时软件包并调用运行时间.GOMAXPROCS(NCPU)。有用的值可能是runtime.NumCPU(),它报告本地计算机上的逻辑CPU数量。同样,随着调度和运行时间的提高,这个要求预计会退役。

+1

注意,由于调度程序的改进,对于go1.5,'GOMAXPROCS'现在将默认为'runtime。NumCPU()'(尽管'runtime.GOMAXPROCS'调用仍然存在,因为NumCPU并不是普遍最优的) – JimB