2017-09-26 24 views
0

我有兩個問題:概念,是一個正確的做法,使用夠程(這有什麼錯我的代碼)

一)是否有意義旋轉起來多夠程在一個循環的類似計算數學結果?

b)爲什麼我的代碼不工作(這是我第一次嘗試goroutines)?我猜這與關閉頻道有關。

package main 

import (
    "fmt" 
    "math" 
    "sync" 
) 

func main() { 
    input := [][]int{ 
     []int{10, 9}, 
     []int{5, 2}, 
     []int{4, 9}, 
    } 

    var wg sync.WaitGroup 
    c := make(chan int) 
    for _, val := range input { 
     wg.Add(1) 
     go func(coordinates []int, c chan int) { 
      defer wg.Done() 
      c <- calculateDistance(coordinates[0], coordinates[1]) 
     }(val, c) 
    } 
    distances := []int{} 

    for val := range c { 
     distances = append(distances, val) 
    } 
    wg.Wait() 
    fmt.Println(distances) 
} 

func calculateDistance(x int, y int) int { 
    v := math.Exp2(float64(x)) + math.Exp2(float64(y)) 
    distance := math.Sqrt(v) 
    return int(distance) 
} 

遊樂場鏈路:https://play.golang.org/p/0iJ9hFnb8R

+2

明確你的意思是「不起作用」。 – Peter

+0

致命錯誤:所有goroutines都睡着了 - 僵局! 夠程1瓚收到]: main.main() \t /tmp/sandbox241190633/main.go:27 + 0x2e0 – nbsp

+1

當你得到它的工作,你可以學習如何運行基準測試,看它是否使用夠程的價值。作爲一個觀點,這還不夠數字琢磨去做出很多改變。當你運行一些阻塞的代碼時,通常你會使用goroutine,比如磁盤或網絡中的'io'。 goroutine(可能是主要的)會阻止數據的等待,浪費時間你可能會用空閒的CPU做其他事情。 https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go – RayfenWindspear

回答

5

a)是的,如果您有多個CPU,則可以啓動多個go例程來執行CPU綁定任務。此外,對代碼進行配置以查看實際是否有任何好處是非常重要的。你可以用benchmark框架中的go來幫助做到這一點。

由於受CPU限制,它可能是一個很好的開始做同步,然後綁定您的goroutines到CPU核心的數量而不是輸入列表中的項目數,但實際上它應該是度量驅動的查看。 Go提供驚人的工具鏈使用基準和pprof來憑經驗確定什麼是最有效的方法:)

b)https://play.golang.org/p/zGEQGC9EIy您的頻道永不關閉,您的主線程永不結束。這個例子一直等到所有的例程完成他們的工作,然後關閉通道。

+0

非常感謝代碼編輯和基準測試建議。 – nbsp

2

範圍遍歷當通道被封閉的通道終止。既然你永遠不會關閉你的程序中的頻道,那麼主要的例程終將永遠阻止,試圖從c中接收。

Does it make sense to spin up multiple goroutines in a loop for something like calculating a math result?

取決於。如果你還沒有看到它,我可以推薦Rob Pike的演講Concurrency is not parallelism。這可能會給你一些關於哪裏有益的直覺,哪些不是。