2 回答

TA貢獻1877條經(jīng)驗 獲得超6個贊
死鎖不在 range-over-channel 循環(huán)上。如果您在操場上運行代碼,您會在堆棧跟蹤的頂部看到錯誤是由wg2.Wait
(操場上的第 88 行并由堆棧跟蹤指向)引起的。同樣在堆棧跟蹤中,您可以看到所有因死鎖而未完成的 goroutine,這是因為oneResult<-t
從未完成,因此循環(huán)中啟動的 goroutine 都沒有完成。
所以主要問題在這里:
wg2.Wait()
close(oneResult)
// ...
for n := range oneResult{
// ...
我想,在封閉的頻道上循環(huán)也不是你想要的。但是,即使您沒有關閉頻道,該循環(huán)也永遠不會開始,因為wg2.Wait()
它會等到完成。
oneResult?<-?t wg2.Done()
但它永遠不會完成,因為它依賴于已經(jīng)運行的循環(huán)。該線路oneResult <- t
不會完成,除非另一側(cè)有人從該通道接收信號,這是您的循環(huán),但是該通道范圍循環(huán)仍在等待完成wg2.Wait()
。
所以本質(zhì)上你在通道的發(fā)送者和接收者之間有一個“循環(huán)依賴”。
要解決此問題,您需要允許循環(huán)開始從通道接收數(shù)據(jù),同時仍確保該通道在完成后關閉。你可以通過將兩條等待和關閉線包裝到它們自己的 goroutine 中來做這件事。
https://play.golang.com/p/rwwCFVszZ6Q
- 2 回答
- 0 關注
- 161 瀏覽
添加回答
舉報