我正在研究A Tour of Go的Concurrency 部分,我很好奇使用有限通道的正确 Go 约定。在本练习中,我需要从两个通道读取值并确定这些值是否相同且顺序相同。如果没有,我可以立即从我的方法中返回。但是,如果我这样做,Go 会自动为我清理我的频道,还是我的 goroutine 会永远挂起并消耗资源?false处理此问题的最佳方法是将取消通道传递到我的 goroutine 中,但由于 goroutine 读取的数据量有限,因此只消耗所有数据似乎没问题。在现实生活中处理这种情况的最佳方法是什么?
2 回答
侃侃尔雅
TA贡献1801条经验 获得超16个赞
Andrew Gerrand 在 Gophercon 的演讲涵盖了幻灯片 37上的这个确切问题。
创建一个退出频道并将其传递给每个步行者。通过在 Same 退出时关闭退出,任何正在运行的步行者都会被终止。
func Same(t1, t2 *tree.Tree) bool {
quit := make(chan struct{})
defer close(quit)
w1, w2 := Walk(t1, quit), Walk(t2, quit)
for {
v1, ok1 := <-w1
v2, ok2 := <-w2
if v1 != v2 || ok1 != ok2 {
return false
}
if !ok1 {
return true
}
}
}
- 2 回答
- 0 关注
- 214 浏览
添加回答
举报
0/150
提交
取消