2017-09-26 4 views
0

私が持っている2質問:概念的には、ゴルーチンを使用して(とどのような私のコードと一緒に間違っている)への正しいアプローチがある

a)は、それは数学の計算のようなもののためにループ内で複数のゴルーチンをスピンアップしても意味がありません結果?

b)なぜ私のコードが機能しないのですか(これは私の最初のゴルーチンの試みです)?私はそれがチャンネルを閉じることと関係があると推測しています。

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

致命的なエラー:すべてのゴルーチンが眠っている - デッドロック! ゴルーチン1 [チャン受信]: main.main() \t /tmp/sandbox241190633/main.go:27 + 0x2e0 – nbsp

+1

あなたはそれが働いて得るとき、あなたはそれがゴルーチンを使用して価値があるかどうかを確認するためにベンチマークを実行する方法を学ぶことができます。意見としては、これは実際には大きな違いを生み出すために十分な数字ではありません。通常、ディスクやネットワークから 'io'のようにブロックするコードを実行しているときに、goroutineを使用します。 goroutine(おそらくメインのもの)は、データの待機をブロックし、アイドル状態のCPUで何か他のことをする時間を無駄にします。 https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go – RayfenWindspear

答えて

5

)はい、複数のCPUがある場合は、複数のgoルーチンをスピンアップしてCPUバインドタスクを実行することができます。また、実際に利益があるかどうかを調べるためにコードをプロファイルすることが非常に重要です。これを行うには、benchmarkフレームワークで構築されたgoを使用することができます。

CPUによって制限されているので、同期をとるのが良いスタートになる可能性があり、入力リストの項目数ではなくCPUコアの数にゴルーチンをバインドすることができます見る。 Goは、ベンチマークとpprofを使用して、最も効率的なアプローチが何であるかを経験的に判断します。

b)https://play.golang.org/p/zGEQGC9EIyチャンネルは決して終了せず、メインスレッドは終了しません。この例では、すべてのgoルーチンが作業を終了してからチャネルを閉じるまで待機しています。

+0

コード編集とベンチマークの提案に感謝します。 – nbsp

2

範囲ループが終了します。あなたがあなたのプログラムで決してチャンネルを閉じることはないので、メインのゴルーチンは最終的に永遠にブロックされ、cから受信しようとします。

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

に依存します。あなたがまだそれを見ていない場合、私はロブパイクの話Concurrency is not parallelismをお勧めできます。これは、どこに有益であるか、どこにないかについての直感を与えるかもしれません。

関連する問題