2 回答

TA贡献2037条经验 获得超6个赞
似乎最有可能的是nodes在取消上下文之前关闭参数中传递的通道。这会将您的for循环变成紧密循环,从而消耗所有可用的 CPU。ok由于通道一旦关闭就无法重新打开,因此一旦为 false,您就可以安全地从 goroutine 返回,这应该可以解决该问题:
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条经验 获得超12个赞
封闭的 chan 不会阻塞 - 请参阅https://dave.cheney.net/2013/04/30/curious-channels
关闭后将你的 chan 设置为零。
case val, ok := <-n:
if ok {
allNodes <- val
} else {
n = nil
}
然后 select 将阻塞,仅等待完成消息。
- 2 回答
- 0 关注
- 214 浏览
添加回答
举报