我需要在控制台应用程序中运行多个异步任务,并在进一步处理之前等待它们全部完成.
那里有很多文章,但我读的越多越好.我已经阅读并理解了Task库的基本原理,但我显然错过了某处的链接.
我知道可以将任务链接起来,以便它们在另一个完成之后开始(这几乎是我读过的所有文章的场景),但我希望我的所有任务同时运行,我想知道一次他们都完成了.
对于这样的场景,最简单的实现是什么?
考虑这个功能:
func doAllWork() error {
var wg sync.WaitGroup
wg.Add(3)
for i := 0; i < 2; i++ {
go func() {
defer wg.Done()
for j := 0; j < 10; j++ {
result, err := work(j)
if err != nil {
// can't use `return err` here
// what sould I put instead ?
os.Exit(0)
}
}
}()
}
wg.Wait()
return nil
}
Run Code Online (Sandbox Code Playgroud)
在每个goroutine中,该函数work()被调用10次.如果一个调用work()在任何正在运行的goroutine中返回错误,我希望所有goroutine立即停止,并退出程序.可以os.Exit()在这里使用吗?我该怎么处理?
编辑:这个问题不同于如何停止goroutine,因为我需要关闭所有goroutine如果一个错误发生