我正在尝试同时运行多个任务,并在出现任何错误时立即返回,而无需等待所有例程返回。代码如下所示。我已经去除了噪音以使其更容易消化,但如果泄漏不明显,我可以发布完整的代码。值得注意的是,我正在谷歌应用引擎上部署它。我无法在我的机器上重现泄漏,但是当我在// Consume the results评论后替换并发时,应用程序运行良好,但我不明白为什么,因为代码对我来说是正确的。
package main
import "fmt"
import "sync"
import "errors"
func main() {
indexes := []int{1, 2, 3, 4, 5, 6, 7}
devCh := make(chan int, 7)
stopCh := make(chan struct{})
errCh := make(chan error, 7)
var wg sync.WaitGroup
go func() {
for _, sub := range indexes {
wg.Add(1)
go func(sub int) {
defer wg.Done()
// some code which creates other
// wait groups and spans other go routines
// handle errors
if sub == 99 { // unreachable
errCh <- errors.New("new error")
}
}(sub)
select {
// If there is any error we better stop the
// loop
case <-stopCh:
return
default:
}
devCh <- sub
}
wg.Wait()
close(devCh)
}()
// Consume the results
var results []int
var wt sync.WaitGroup
wt.Add(1)
go func() {
defer wt.Done()
for s := range devCh {
results = append(results, s)
}
return
}()
done := make(chan struct{})
go func() {
wt.Wait()
close(done)
}()
L:
for {
select {
case err := <-errCh:
fmt.Printf("error was %v", err)
close(stopCh)
return
case <-done:
break L
default:
}
}
fmt.Printf("all done, %v", results)
}
青春有我
相关分类