当前位置: 首页 > article >正文

Go语言sync.WaitGroup与errgroup.Group用法详解

errgroup.Groupsync.WaitGroup 的主要区别在于它们的错误处理和协程管理方式。

errgroup.Group 专为并发操作中的错误捕获设计,任意goroutine返回错误时,会立即终止其他goroutine的执行

sync.WaitGroup 主要用于等待多个 goroutine 完成,不会直接处理错误。

用法示例:

// errgroup
import (
	"fmt"
	"golang.org/x/sync/errgroup"
)

func main() {
	group := new(errgroup.Group)

	group.Go(func() error {
		// 模拟一个操作,可能会失败
		err := someOperation()
		if err != nil {
			return fmt.Errorf("operation failed: %v", err)
		}
		return nil
	})

	// 等待所有任务完成,并捕获错误
	if err := group.Wait(); err != nil {
		fmt.Println("任务执行中遇到错误:", err)
	} else {
		fmt.Println("所有任务执行完成")
	}
}
工作流程
  1. 调用 group.Go 添加需要并发执行的任务。
  2. group.Wait() 会等待所有任务完成。如果某个 goroutine 返回错误,Wait 会返回该错误。
  3. errgroup 会终止错误出现后所有未完成的 goroutine,确保资源节省和异常处理的统一性。
优点
  • 错误处理:直接返回错误,避免了手动捕获。
  • 中止机制:在遇到错误后自动中止其他任务。
import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	var mu sync.Mutex // 用于防止并发访问

	results := make(map[int]string)

	for i := 1; i <= 5; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			result, err := someOperation(id)
			mu.Lock()
			defer mu.Unlock() // 锁定操作以确保安全访问
			if err != nil {
				results[id] = fmt.Sprintf("error: %v", err)
			} else {
				results[id] = fmt.Sprintf("success: %v", result)
			}
		}(i)
	}

	wg.Wait()
	fmt.Println("所有操作完成", results)
}

errgroup.Groupsync.WaitGroup 的总结对比

特性errgroup.Groupsync.WaitGroup
错误处理支持,返回第一个错误并中止其他任务不支持,需手动处理
中止机制出现错误后可中止其他任务不支持
适合场景并发任务中需统一错误处理仅需等待所有任务完成
代码简洁性更简洁,内置错误处理需要手动处理错误和并发访问控制
底层实现基于 sync.WaitGroup 进一步封装基础并发任务等待工具

选择哪种方式取决于需求,若并发任务中需要统一的错误捕获和中止机制,errgroup.Group 是更好的选择;若仅需等待所有任务执行完毕,可使用 sync.WaitGroup


http://www.kler.cn/a/379490.html

相关文章:

  • 『YOLO』| 断点训练、解决训练中断异常情况
  • 拯救者y7000p 打开XMP
  • 一些常用的react hooks以及各自的作用
  • 算法实现 - 快速排序(Quick Sort) - 理解版
  • pycharm调用方法时显示为灰色
  • 深入浅出 | 谈谈MNN GPU性能优化策略
  • 迅为itop-3568开发板AMP双系统使用手册之烧写AMP镜像
  • 力扣第33题:搜索旋转排序数组
  • 聚水潭数据集成到MySQL的技术实操与解决方案
  • Vue前端开发:事件对象参数
  • Docker-安装
  • Flutter UI架构(3)
  • gulp入门教程18:gulp插件gulp-clean
  • RLHF中,人类反馈数据格式是什么样的?
  • PostgreSQL 取前一列不为 NULL
  • 程序《工资分类收税》
  • 2024/11/3 随笔笔记
  • 深度学习笔记之BERT(一)BERT的基本认识
  • 利用Spring Boot框架打造信息学科平台
  • Golang | Leetcode Golang题解之第520题检测大写字母
  • GitHub、Gitee、GitLab介绍
  • [spring源码]spring推断构造方法
  • 【深入浅出】深入浅出Bert(附面试题)
  • Ubuntu 开通 SSH 连接方式指南
  • 论文阅读笔记Dense Passage Retrieval for Open-Domain Question Answering
  • 突破自闭症治疗的创新方法和评估