在這段代碼中,我調用了一個函數(shù)來計算字符串中字母的數(shù)量,并返回一個符文圖。為了利用并發(fā)性,我使用 goroutines 調用該函數(shù):func ConcurrentFrequency(l []string) FreqMap { var wg sync.WaitGroup wg.Add(len(l)) m := FreqMap{} // Using unbuffered channel // ch := make(chan FreqMap, len(l)) ch := make(chan FreqMap) for _, s := range l { go func(s string, ch chan<- FreqMap) { defer wg.Done() ch <- Frequency(s) }(s, ch) } go func() { wg.Wait() close(ch) }() for cm := range ch { for r, n := range cm { m[r] += n } } return m}如果我在不使用等待組和關閉通道的 goroutine 的情況下嘗試此代碼: go func() { wg.Wait() close(ch) }(),然后我陷入僵局。我不明白的是,為什么我能夠遍歷無緩沖通道,并從中讀取多個地圖。這是完整的程序: https ://go.dev/play/p/zUwr_HvTT5w并發(fā)方法僅比順序方法快:goos: linuxgoarch: amd64pkg: lettercpu: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHzBenchmarkSequentialFrequencyBenchmarkSequentialFrequency-2 2820 367128 ns/op 17571 B/op 13 allocs/opBenchmarkConcurrentFrequencyBenchmarkConcurrentFrequency-2 4237 282632 ns/op 12682 B/op 72 allocs/opPASSok letter 3.320s
我不明白為什么這適用于無緩沖通道,或者為什么需要等待組
幕布斯7119047
2022-12-13 16:02:01