golang用errgroup的一个小小坑
目标:假设有10个待处理的数据,每个数据处理结果互不干涉
如果我这么实现
func testCanceled() error {
ctx := context.Background()
ctx = context.WithValue(ctx, "key", "使用ctx")
group,withCtx := errgroup.WithContext(ctx)
for i := 1; i < 10; i++ {
index := i
group.Go(func() error {
fmt.Println("............", index, withCtx.Value("key"))
time.Sleep(time.Second)
if index == 7 {
return errors.New("人为失败")
}
if withCtx.Err() == context.Canceled {
fmt.Println("............", index, "canceled")
}
return nil
})
}
err := group.Wait()
if err != nil {
fmt.Println(err.Error())
return nil
}
return nil
}
那么我的输出结果是这样的
............ 1 使用ctx
............ 9 使用ctx
............ 4 使用ctx
............ 5 使用ctx
............ 6 使用ctx
............ 7 使用ctx
............ 8 使用ctx
............ 2 使用ctx
............ 3 使用ctx
............ 6 canceled
............ 9 canceled
............ 1 canceled
............ 3 canceled
人为失败
这样的
............ 9 使用ctx
............ 5 使用ctx
............ 6 使用ctx
............ 7 使用ctx
............ 2 使用ctx
............ 1 使用ctx
............ 4 使用ctx
............ 8 使用ctx
............ 3 使用ctx
人为失败
或者这样的
............ 1 使用ctx
............ 9 使用ctx
............ 4 使用ctx
............ 2 使用ctx
............ 3 使用ctx
............ 5 使用ctx
............ 6 使用ctx
............ 7 使用ctx
............ 8 使用ctx
............ 6 canceled
............ 4 canceled
............ 1 canceled
............ 5 canceled
............ 3 canceled
能看出来,其他处理项被失败的项干扰了
结论:这种要求处理任务间互不干扰的并发处理,如果使用errgroup,不能返回error