雖然我看到過類似的問題,但在 SO 上找到的答案都沒有幫助我,但我希望有鷹眼的善良靈魂可以幫助我在這里查明問題。我知道這不是 goroutines 的最佳用途,但我想以這種方式作為練習,但顯然失敗了。我的代碼package mainimport ( "fmt" "sort" "sync")func main() { X := []int{1, 2, 3, 4, 0} Y := []int{2, 3, 6, 8, 4} solution := Solution(X, Y) fmt.Println(solution)}//Solution solutionfunc Solution(X []int, Y []int) int { size := len(X) resultChan := make(chan int) results := make(map[int]int) ParseDivision(size, X, Y, resultChan) for val := range resultChan { results[val] = results[val] + 1 } close(resultChan) return FindGreatest(results)}//Divide dividefunc Divide(a int, b int, resultChan chan<- int, wg *sync.WaitGroup) { defer wg.Done() result := float64(a) / float64(b) resultChan <- int(result * 1000)}//FindGreatest find greatest in mapfunc FindGreatest(myMap map[int]int) int { values := make([]int, 0, len(myMap)) for _, val := range myMap { values = append(values, val) } sort.Ints(values) return values[len(values)-1]}//ParseDivision intfunc ParseDivision(lenth int, X []int, Y []int, resultChan chan<- int) { var wg sync.WaitGroup wg.Add(lenth) for i := 0; i < lenth; i++ { go Divide(X[i], Y[i], resultChan, &wg) } wg.Wait()}結果:fatal error: all goroutines are asleep - deadlock!我完全不確定為什么我已經遵循了一些示例以及 SO 的答案,關于通過引用傳遞 waitGroup 以及使用通道來獲取在 goroutine 中執行的操作的結果。
1 回答

繁星淼淼
TA貢獻1775條經驗 獲得超11個贊
需要注意的一些事項:
寫入通道的 go-routine 通常應該關閉通道;
從上面開始,“閱讀器” go-routine 應該等待通道關閉(通過范圍等) - 即它永遠不必關閉其讀取的通道。
由于您的結果通道是無緩沖的(緩沖區大小為 0),主 go-routine 阻塞等待工作人員嘗試寫入,并且主要 go-routine 尚未(尚未)從結果通道讀?。ㄗ鳛槌毓芾砥?go-必須完成例程才能發生這種情況 - 死鎖?。?。解決方案:
確保工作池 go-routine 獨立于主(閱讀器)go-routine 運行。
3 行修復: https: //play.golang.org/p/9hYuyDgMjGi
- 1 回答
- 0 關注
- 175 瀏覽
添加回答
舉報
0/150
提交
取消