github.com/aaabigfish/gopkg@v1.1.0/syncx/errgroup/doc.go (about) 1 // Package errgroup provides synchronization, error propagation, and Context 2 // errgroup 包为一组子任务的 goroutine 提供了 goroutine 同步,错误取消功能. 3 // 4 //errgroup 包含三种常用方式 5 // 6 //1、直接使用 此时不会因为一个任务失败导致所有任务被 cancel: 7 // g := &errgroup.Group{} 8 // g.Go(func(ctx context.Context) { 9 // // NOTE: 此时 ctx 为 context.Background() 10 // // do something 11 // }) 12 // 13 //2、WithContext 使用 WithContext 时不会因为一个任务失败导致所有任务被 cancel: 14 // g := errgroup.WithContext(ctx) 15 // g.Go(func(ctx context.Context) { 16 // // NOTE: 此时 ctx 为 errgroup.WithContext 传递的 ctx 17 // // do something 18 // }) 19 // 20 //3、WithCancel 使用 WithCancel 时如果有一个人任务失败会导致所有*未进行或进行中*的任务被 cancel: 21 // g := errgroup.WithCancel(ctx) 22 // g.Go(func(ctx context.Context) { 23 // // NOTE: 此时 ctx 是从 errgroup.WithContext 传递的 ctx 派生出的 ctx 24 // // do something 25 // }) 26 // 27 //设置最大并行数 GOMAXPROCS 对以上三种使用方式均起效 28 //NOTE: 由于 errgroup 实现问题,设定 GOMAXPROCS 的 errgroup 需要立即调用 Wait() 例如: 29 // 30 // g := errgroup.WithCancel(ctx) 31 // g.GOMAXPROCS(2) 32 // // task1 33 // g.Go(func(ctx context.Context) { 34 // fmt.Println("task1") 35 // }) 36 // // task2 37 // g.Go(func(ctx context.Context) { 38 // fmt.Println("task2") 39 // }) 40 // // task3 41 // g.Go(func(ctx context.Context) { 42 // fmt.Println("task3") 43 // }) 44 // // NOTE: 此时设置的 GOMAXPROCS 为2, 添加了三个任务 task1, task2, task3 此时 task3 是不会运行的! 45 // // 只有调用了 Wait task3 才有运行的机会 46 // g.Wait() // task3 运行 47 package errgroup