golang并发控制

常见的并发控制

常见的并发控制

channel:通过无缓冲的channel进行同步调用,有缓冲的channel进行异步调用,也可限制并发数量

waitgroup:可以通过add来动态调整,释放的时间需要使用defer 进行wg.done操作

context:通过在协程之间传递上下文消息,可对派生的子协程进行并发控制,防止资源浪费

高并发任务控制包

b站开源的并发控制包,对以上三种并发控制包的优点进行融合。限制并发数量,对并发上下文控制等。 虽然官方在go1.17版本也引入并发控制包,但没有b站开源的支持场景多,建议使用b站开源包,简单场景可使用官方包。我们一般使用高并发,处理大量的数据分析工作。对用一个job拥有子任务的时候,对于整个任务有两种限制:

  • 一个任务失败会导致所有*未进行或进行中*的任务被 cancel
  • 一个任务失败导致所有任务被 cancel

Notice:在并行进行任务调度的时候,做好业务侧兜底,失败的任务进行日志记录,告警等。

并发控制包

kratos并发控制包:

errgroup package - github.com/bilibili/kratos/pkg/sync/errgroup - Go Packages

官方1.17后引入:

https://pkg.go.dev/golang.org/x/sync/errgroup#pkg-overview  

b站开源开发控制包demo详情

并发数量限制

设置最大并行数 GOMAXPROCS 对以上三种使用方式均起效 NOTE: 由于 errgroup 实现问题,设定 GOMAXPROCS 的 errgroup 需要立即调用 Wait() 例如:

g := errgroup.WithCancel(ctx)
g.GOMAXPROCS(2)
// task1
g.Go(func(ctx context.Context) {fmt.Println("task1")
})
// task2
g.Go(func(ctx context.Context) {fmt.Println("task2")
})
// task3
g.Go(func(ctx context.Context) {fmt.Println("task3")
})
// NOTE: 此时设置的 GOMAXPROCS 为2, 添加了三个任务 task1, task2, task3 此时 task3 是不会运行的!
// 只有调用了 Wait task3 才有运行的机会
g.Wait() // task3 运行

子任务失败所有任务被取消

g := errgroup.WithCancel(ctx)
g.Go(func(ctx context.Context) {// NOTE: 此时 ctx 是从 errgroup.WithContext 传递的 ctx 派生出的 ctx// do something
})

子任务执行失败不影响其他子任务继续执行
 

直接使用 此时不会因为一个任务失败导致所有任务被 cancel:g := &errgroup.Group{}
g.Go(func(ctx context.Context) {// NOTE: 此时 ctx 为 context.Background()// do something
})
WithContext 使用 WithContext 时不会因为一个任务失败导致所有任务被 cancel:g := errgroup.WithContext(ctx)
g.Go(func(ctx context.Context) {// NOTE: 此时 ctx 为 errgroup.WithContext 传递的 ctx// do something
})

参考资料:

errgroup package - github.com/bilibili/kratos/pkg/sync/errgroup - Go Packages

 errgroup package - golang.org/x/sync/errgroup - Go Packages

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397514.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记本CPU天梯图(2024年8月),含AMD/骁龙等新CPU

原文地址(高清无水印原图/持续更新/含榜单出处链接): 2024年8月笔记本CPU天梯图 2024年8月笔记本CPU天梯图 2024年8月5日更新日志:常规更新Cinebench R23、PassMark笔记本CPU天梯图,新增Geekbench 6.2单核多核天梯图&…

inner join, left join, right join, full join 的区别

1. 初始化表结构 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for t_city -- ---------------------------- DROP TABLE IF EXISTS t_city; CREATE TABLE t_city (id varchar(255) CHARACTER SET utf8mb4 COLLATE utf…

Windows Server修改远程桌面端口

新建入站规则 填写端口 允许连接 修改远程桌面端口 winR打开注册表 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp修改PortNumber为新端口 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wi…

根据 IP 地址配置子网示例(下挂 hub 接不同 vlan 终端)

我们一般根据端口配置子网比较简单,但是如果换接口,就又要到交换机上重新配置端口所属 vlan 了,紧急情况下,还是比较耽误时间的。但如果根据IP地址配置 vlan,则可以插在交换机上任意端口,排障时比较节省时间…

深入理解Linux线程:从基础到进阶的全面指南

目录 一.线程概念1.理解Linux下的线程2.线程优缺点与异常3.线程VS进程4.再谈进程地址空间 二.线程控制1.线程的创建使用2.线程在进程地址空间的结构3.初窥多线程4.多线程抢票 三.线程互斥1.进程线程间的互斥相关背景概念2.互斥锁 四.线程安全1.线程安全和可重入函数2.死锁3.线程…

人工智能时代:程序员的核心竞争力重塑之旅

人工智能时代:程序员的核心竞争力重塑之旅 在人工智能(AI)技术日新月异的今天,程序员的角色与职责正经历着前所未有的变革。随着自动化、智能化工具的普及,许多传统编程任务被高效替代,这不禁让人思考&…

【基础算法总结】BFS 解决 FloodFill 算法

BFS 解决 FloodFill 算法 1.图像渲染2.岛屿数量3.岛屿的最大面积4.被围绕的区域 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 FloodFill 算…

【基础算法总结】BFS 解决最短路径问题

BFS 解决最短路径问题 1.最短路径问题简介2.迷宫中离入口最近的出口3.最小基因变化4.单词接龙4.为高尔夫比赛砍树 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!&#x1…

Day17 枚举、typedef、位运算、堆空间的学习

目录 枚举 typedef 位运算 堆上的空间 枚举 一个一个列举出来,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。 作用: 1、为了提高代码的可读性 2、提高代码的安全性 枚举类型 基本语法: enum 枚举名 { …

根据toml编译生成whl

1、安装build pip install build如果已经安装build, 那就执行一下升级命令 python3 -m pip install --upgrade build2、在pyproject.toml所在的文件夹那一层执行 # -w:生成whl文件 -v:显示python编译过程 python3 -m build -w -v2.1 当出现以下输出,需要耐心等待…

Java 集成测试详解及示例

通过综合指南探索 Java 集成测试的世界。了解工具、流程和最佳实践,并辅以实际示例。 随着软件系统变得越来越大、越来越复杂,组件和服务以错综复杂的方式交互,集成测试已变得不可或缺。通过验证所有组件和模块在组合时是否正常工作&#xff…

入门岛2-python实现wordcount并进行云端debug

书生大模型学习 任务: 1.实现一个wordcount函数,统计英文字符串中每个单词出现的次数。返回一个字典,key为单词,value为对应单词出现的次数。 2.Vscode连接InternStudio debug TIPS:记得先去掉标点符号,然后把每个单词…

Mybatis学习-day19

Mybatis学习-day19 1. resultMap resultMap 是 MyBatis 中最复杂的元素&#xff0c;主要用于解决实体类属性名与数据库表中字段名不一致的情况&#xff0c;可以将查询结果映射成实体对象。 <resultMap id"staffAndDep" type"com.easy.bean.Staff">…

解決android Studio在导入已有的工程 build 时出现的错误

最近在学习andriod方面的知识&#xff0c;第一次使用android Studio导入别人的项目&#xff0c;从导入到build出现了几个问题&#xff0c;在这里记录以下解决过程。 SDK location not found 如下图报错所示&#xff0c;看网上教程有的说是SDK未安装&#xff0c;这里我是明确自…

两个AI关小黑屋:Llama3.1把Claude Opus聊自闭了

把Llama 3.1 405B和Claude 3超大杯Opus双双送进小黑屋&#xff0c;你猜怎么着—— Llama把Claude整得精神崩溃了&#xff0c;Claude明确拒绝继续聊天&#xff0c;还要再被Llama PUA的那种。 在一场AI和AI对话的安全词模拟实验中&#xff0c;X上的这位人类监督者记录下了一出好…

【HarmonyOS NEXT星河版开发学习】小型测试案例12-点赞案例

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 本案例主要运用了交互点击事件和基础的算术运算符的应用&#xff0c;难度并不大&#xff0c;卡片的制作相对来说并不是太难&#xff0…

机器学习/深度学习——模型的欠拟合和过拟合,正则化方法详解

机器学习/深度学习——模型的欠拟合和过拟合&#xff0c;正则化方法 详解 搭配以下文章进行学习&#xff1a; 卷积神经网络&#xff1a; 深度学习——卷积神经网络&#xff08;convolutional neural network&#xff09;CNN详解&#xff08;一&#xff09;——概述. 步骤清晰…

深度解析HAProxy:构建高可用负载均衡的终极指南

目录 haproxy配置文件组成 实验环境 haproxy安装 haproxy的配置文件说明 全局配置段global 多进程和多线程配置 代理配置段proxies server配置说明 实验相关配置 测试效果&#xff1a; haproxy的状态页 socat命令 socat命令的一些常用示例 HAProxy的调度算法 静…

网鼎杯-2018-Web-Unfinish

先尝试万能注入&#xff1a; 如果万能注入缺少符号&#xff0c;如果加符又进不去&#xff0c;那我们尝试扫描文件,然后发现有一个register.php的文件&#xff0c;应该是注册页面&#xff0c;我们去打开 知道存储的文件&#xff0c;并利用状态码进行过滤 我们注册的用户名就是aa…

【Redis 进阶】集群(重点理解流程和原理)

一、基本概念 前面学习的哨兵模式&#xff0c;提高了系统的可用性。但是真正用来存储数据的还是 master 和 slave 节点&#xff0c;所有的数据都需要存储在单个 master 和 slave 节点中。如果数据量很大&#xff0c;接近超出了 master / slave 所在机器的物理内存&#xff0c…