考虑一组检查工作,每个检查工作都有独立的逻辑,因此它们似乎可以并发运行,例如:
type Work struct {
// ...
}
// This Check could be quite time-consuming
func (w *Work) Check() bool {
// return succeed or not
//...
}
func CheckAll(works []*Work) {
num := len(works)
results := make(chan bool, num)
for _, w := range works {
go func(w *Work) {
results <- w.Check()
}(w)
}
for i := 0; i < num; i++ {
if r := <-results; !r {
ReportFailed()
break;
}
}
}
func ReportFailed() {
// ...
}
在关注 的时候results,如果逻辑是无论哪个工作失败,我们断言所有工作都完全失败,通道中剩余的值是无用的。让剩余未完成的 goroutines 继续运行并将结果发送到通道是没有意义和浪费的,尤其是在w.Check()相当耗时的情况下。理想效果类似于:
for _, w := range works {
if !w.Check() {
ReportFailed()
break;
}
}
这只运行必要的检查工作然后中断,但在顺序非并发场景中。
那么,是否可以取消这些未完成的goroutines,或者发送到channel?
哔哔one
料青山看我应如是
凤凰求蛊
相关分类