【发布时间】:2022-10-25 16:15:12
【问题描述】:
我正在学习 golang,并且在与上下文一起使用时对 errgroup 包感到困惑。 这是我的简单代码:
package main
import (
"context"
"errors"
"fmt"
"time"
"golang.org/x/sync/errgroup"
)
func main() {
fmt.Println("..................")
ctx := context.Background()
group, ctx := errgroup.WithContext(ctx)
ctx, cancel := context.WithCancel(ctx)
group.Go(func() error {
//return errors.New("Error 1")
time.Sleep(8 * time.Second)
fmt.Println("Sleep 1 ended..................")
cancel()
return errors.New("Error 1")
})
group.Go(func() error {
//return errors.New("Error 1")
time.Sleep(2 * time.Second)
fmt.Println("Sleep 2 ended..................")
cancel()
return errors.New("Error 2")
})
err := group.Wait()
if err != nil {
fmt.Println("Error: ", err)
}
fmt.Println("..................")
}
正如预期的那样,输出是:
..................
Sleep 2 ended..................
Sleep 1 ended..................
Error: Error 2
..................
group.Wait() “阻塞,直到 Go 方法的所有函数调用都返回,然后从它们返回第一个非 nil 错误(如果有)。” 问题:
- 如果我想使用 errgroup 但想等到 所有 Go 方法共享的上下文被取消或全部 Go 方法的函数调用已经返回?
- 如果我想使用 errgroup 但想等到其中一个 Go 方法返回错误时,哪种方法会取消上下文而不是等待全部完成?
不知何故,我觉得 errgroup 包的使用限制太大。我错过了什么?
【问题讨论】:
标签: go