私が持っている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
「機能しない」という意味を明確にしてください。 – Peter
致命的なエラー:すべてのゴルーチンが眠っている - デッドロック! ゴルーチン1 [チャン受信]: main.main() \t /tmp/sandbox241190633/main.go:27 + 0x2e0 – nbsp
あなたはそれが働いて得るとき、あなたはそれがゴルーチンを使用して価値があるかどうかを確認するためにベンチマークを実行する方法を学ぶことができます。意見としては、これは実際には大きな違いを生み出すために十分な数字ではありません。通常、ディスクやネットワークから 'io'のようにブロックするコードを実行しているときに、goroutineを使用します。 goroutine(おそらくメインのもの)は、データの待機をブロックし、アイドル状態のCPUで何か他のことをする時間を無駄にします。 https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go – RayfenWindspear