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