Golang errgroup怎么用_Golang errgroup并发教程【最新】
errgroup.WithContext是唯一安全初始化方式,必须传入带超时的context;GoContext()用于可取消IO操作,Go()仅适用于纯CPU计算;Wait()只返回首个错误且不捕获panic。errgroup.WithContext 是唯一安全的初始化方式直接 new(errgroup.Group) 或 errgroup.Group{} 会丢失上下文控制能力——超时、取消全部失效,任务失败后可能永久卡住。必须用 errgroup.WithContext 初始化,并传入带超时的 context。错误写法:var g errgroup.Group → 后续调用 g.Wait() 无法响应超时,ctx.Err() 永远为 nil正确写法:g, ctx := errgroup.WithContext(context.WithTimeout(context.Background(), 5*time.Second))超时时间要覆盖整个任务链(比如 HTTP 请求 + JSON 解析 + 写文件),不能只包某一步第三方库(如 http.Client)必须显式使用 WithContext 方法,否则 errgroup 的超时会被绕过Go() 和 GoContext() 到底该选哪个Go() 只接受无参函数,完全不感知 context;GoContext() 显式接收 ctx 参数,并在内部自动监听 ctx.Done(),适合所有可取消的 IO 操作。HTTP 请求、数据库查询、文件读写 → 必须用 GoContext(),否则 context 取消后 goroutine 继续跑,资源泄漏、错误被掩盖纯 CPU 计算(如 base64 编码、简单数学运算)→ 可用 Go(),但得确保它真的不阻塞、不依赖外部状态混用风险高:一个用 Go(),另一个用 GoContext(),前者可能还在跑,后者已退出,Wait() 返回后你根本不知道它是否完成示例:g.GoContext(func(ctx context.Context) error { return http.GetWithContext(ctx, url) })Wait() 返回 nil 不代表全成功errgroup.Wait() 返回 nil,只表示「所有已启动的任务都完成了,且没报告非 nil 错误」——但它不检查 panic,也不保证每个 goroutine 都真正执行完毕。 Zeemo AI 一款专业的视频字幕制作和视频处理工具
更多推荐
所有评论(0)