目标:假设有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 := igroup.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