2 回答

TA貢獻2037條經(jīng)驗 獲得超6個贊
似乎最有可能的是nodes在取消上下文之前關(guān)閉參數(shù)中傳遞的通道。這會將您的for循環(huán)變成緊密循環(huán),從而消耗所有可用的 CPU。ok由于通道一旦關(guān)閉就無法重新打開,因此一旦為 false,您就可以安全地從 goroutine 返回,這應(yīng)該可以解決該問題:
go func(n <-chan *pb.Node) {
defer wg.Done()
for {
select {
case <-ctx.Done():
return
case val, ok := <-n:
if !ok {
return
}
allNodes <- val
}
}
}(n)

TA貢獻1776條經(jīng)驗 獲得超12個贊
封閉的 chan 不會阻塞 - 請參閱https://dave.cheney.net/2013/04/30/curious-channels
關(guān)閉后將你的 chan 設(shè)置為零。
case val, ok := <-n:
if ok {
allNodes <- val
} else {
n = nil
}
然后 select 將阻塞,僅等待完成消息。
- 2 回答
- 0 關(guān)注
- 192 瀏覽
添加回答
舉報