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

golang用errgroup的一个小小坑

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


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

相关文章:

  • wordpress网站首页底部栏显示网站备案信息
  • 【前端开发】微信裁剪图片上传
  • #JAVA-常用API-爬虫
  • 【C语言】结构体(四)
  • Hadoop分布式文件系统(二)
  • Python中的函数参数
  • UIlicious - 自动化端到端测试
  • Oracle 建表的存储过程
  • YOLOv11改进,YOLOv11添加SAConv可切换空洞卷积,二次创新C3k2结构
  • Dockerfile 安装echarts插件给java提供服务
  • animate.css和wow.js结合使用实现动画效果
  • 【Windows 11专业版】使用问题集合
  • .net —— Razor
  • 自签发证书配置 HTTPS 单向双向验证
  • 第三方Cookie的消亡与Google服务器端标记的崛起
  • 详解HTML5语言
  • 鸿蒙Next网络请求和解析
  • node.js基础学习-crypto模块-加密解密(九)
  • Java项目实战II基于微信小程序的亿家旺生鲜云订单零售系统的设计与实现(开发文档+数据库+源码)
  • [代码随想录06]哈希表的使用,有效字母异位词,两数组交集,快乐数,两数之和
  • 分层图最短路
  • BGP通过route-policy路由策略调用ip-prefix网络前缀实现负载均衡与可靠性之AS-path属性
  • ES6中,Set和Map的区别
  • 对载入的3dtiles进行旋转、平移和缩放变换。
  • 解决git clone与git push出现的若干问题:Failed to connect to github.com port 443: Timed out
  • tauri使用github action打包编译多个平台arm架构和inter架构包踩坑记录