errgroup,对一组子任务goroutine的同步,错误取消功能
在go中使用goroutine,协程中函数是无法对返回数据直接处理error的。官方库中,有着这么一个收纳子任务error的包:errgroup。
errgroup 包为一组子任务的 goroutine 提供了 goroutine 同步,错误取消功能。
使用
官方test demo
中,ExampleGroup_justErrors
和ExampleGroup_parallel
可以看到,测试先并发一系列子任务,然后wait
等待完成(阻塞的,同步)。
TestZeroGroup
案例,则是测试多子任务,errgroup
是否返回第一个遇到的错误。这里需要注意的是,即使有任务错误,其依然会执行完所有任务,但返回的只是第一个碰到的错误,即使有多个error。
衍生
** kratos**二次封装的errgroup,提供带recover的errgroup,err中包含详细堆栈信息。
errgroup 包含三种常用方式
1、直接使用 此时不会因为一个任务失败导致所有任务被 cancel:
1 | g := &errgroup.Group{} |
2、WithContext 使用 WithContext 时不会因为一个任务失败导致所有任务被 cancel:
1 | g := errgroup.WithContext(ctx) |
3、WithCancel 使用 WithCancel 时如果有一个人任务失败会导致所有未进行或进行中的任务被 cancel:
1 | g := errgroup.WithCancel(ctx) |
设置最大并行数 GOMAXPROCS 对以上三种使用方式均起效
NOTE: 由于 errgroup 实现问题,设定 GOMAXPROCS 的 errgroup 需要立即调用 Wait() 例如:
1 | g := errgroup.WithCancel(ctx) |
本文标题:errgroup,对一组子任务goroutine的同步,错误取消功能
文章作者:小师
发布时间:2020-07-08
最后更新:2022-05-04
原始链接:chunlife.top/2020/07/08/errgroup-对一组子任务goroutine的同步-错误取消功能/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可