doc.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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