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

【从零单排Golang】第十三话:使用WaitGroup等待多路并行的异步任务

在后端开发当中,经常会遇到这样的场景:请求给了批量的输入,对于每一个输入,我们都要给外部发请求等待返回,然后才能继续其它自己的业务逻辑。在这样的case下,如果每一个输入串行处理的话,那么很大一部分时间都会损耗在给外部发请求这个环节,因此我们会希望把这些请求放到各个goroutine里异步执行,等待批量执行完成之后再继续后面的逻辑。这个时候,我们就可以用到这个东西:sync.WaitGroup

WaitGroup提供了增减计数以及阻塞等待计数归零的线程安全接口。当主goroutine增加计数并等待的时候,子goroutine的逻辑中若引用了一个WaitGroup实例的话,也可以在结束(defer)的时候去减少计数,这样当主goroutine自旋等待计数归零时,等待的逻辑就返回了,就继续后面的内容。整体上,就达到了等待多路并行的异步任务这一效果。

一个典型的代码案例如下:

func TestWaitGroup(t *testing.T) {var wg sync.WaitGroupstartTime := time.Now()for i := 0; i < 5; i++ {n := i + 1sleepTime := time.Duration(n) * time.Secondwg.Add(1)go func() {defer wg.Done()t.Logf("task %d started", n)time.Sleep(sleepTime)t.Logf("task %d ended", n)}()}t.Logf("waiting for all tasks done...")wg.Wait()endTime := time.Now()t.Logf("all tasks done! elapsed time: %v", endTime.Sub(startTime))
}

整个逻辑很简单,我们起了5个任务,每个任务分别sleep上1到5秒。主goroutine此时在每个任务开始前,给WaitGroup实例wg加上1个计数,而在子goroutine里,defer地调用wg.Done减少计数。主goroutine起完任务之后,直接调用wg.Wait自选等待。这样5s后等所有任务Done,主goroutine就会接下来打印消耗时间的日志信息了。

打印的内容如下:

=== RUN   TestWaitGroupwg_test.go:26: waiting for all tasks done...wg_test.go:21: task 5 startedwg_test.go:21: task 1 startedwg_test.go:21: task 2 startedwg_test.go:21: task 3 startedwg_test.go:21: task 4 startedwg_test.go:23: task 1 endedwg_test.go:23: task 2 endedwg_test.go:23: task 3 endedwg_test.go:23: task 4 endedwg_test.go:23: task 5 endedwg_test.go:29: all tasks done! elapsed time: 5.0015089s
--- PASS: TestWaitGroup (5.00s)
PASS

WaitGroup的用法非常简单,但这里注意的是,实际遇到这种编程场景,一般会涉及到多任务运行结果收集还有程序异常处理相关的内容。因此,像recover或者select超时等一些子goroutine任务异常处理的逻辑,可能视实际情况都得配合加上。

相关文章:

【从零单排Golang】第十三话:使用WaitGroup等待多路并行的异步任务

在后端开发当中&#xff0c;经常会遇到这样的场景&#xff1a;请求给了批量的输入&#xff0c;对于每一个输入&#xff0c;我们都要给外部发请求等待返回&#xff0c;然后才能继续其它自己的业务逻辑。在这样的case下&#xff0c;如果每一个输入串行处理的话&#xff0c;那么很…...

WSL2安装CentOS7和CentOS8

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载ZIP包&#xff1f;二、安装1.打开Windows子系统支持2.安装到指定位置3.管理虚拟机4.配置虚拟机1.配置国内源2.安装软件3.安装第三方源 5.配置用户1.创建…...

不平衡电网条件下基于变频器DG操作的多目标优化研究(Matlab代码Simulink实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码&Simulink实现&文章讲解 &#x1f4a5;1 概述 文献来源&#xff1a; 最近&#xff0c;利用并网转换器&#xff08;GCC&#xff09;克服电网故障并支撑电网电压已…...

【Leetcode】(自食用)简单题||单词数

step by step. 题目&#xff1a; 统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 请注意&#xff0c;你可以假定字符串里不包括任何不可打印的字符。 示例: 输入: "Hello, my name is John" 输出: 5 解释: 这里的单词是指连续的不是空格…...

C语言代码的x86-64汇编指令分析过程记录

先通过Xcode创建一个terminal APP&#xff0c;语言选择C。代码如下&#xff1a; #include <stdio.h>int main(int argc, const char * argv[]) {int a[7]{1,2,3,4,5,6,7};int *ptr (int*)(&a1);printf("%d\n",*(ptr));return 0; } 在return 0处打上断点&…...

基于springboot+vue的房屋租赁系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

Python文件读写操作详解:从基础到高级

摘要&#xff1a;文件读写是Python编程中常见的操作之一。本文将介绍Python中文件读写的基础知识&#xff0c;包括打开文件、读取文件内容、写入文件、关闭文件等基本操作。此外&#xff0c;还将探讨一些高级文件读写技术&#xff0c;如使用上下文管理器、处理异常、使用with语…...

ThreadLocal基本介绍

文章目录 什么是ThreadLocalThreadLocal解决了什么问题ThreadLocal的作用 ThreadLocal的使用场景ThreadLocal的代码示例ThreadLocal的优点ThreadLocal的缺点与volatile、synchronized、ThreadLocal比较 总结 什么是ThreadLocal ThreadLocal是Java中的一个线程本地变量&#xf…...

ffmpeg源码编译成功,但是引用生成的静态库(.a)报错,报错位置在xxx_list.c,报错信息为某变量未定义

背景&#xff1a;本文是对上一个文章的补充&#xff0c;在源码编译之前&#xff0c;项目是有完整的ffmpeg编译脚本的&#xff0c;只不过新增了断点调试ffmpeg&#xff0c;所以产生的上面的文章&#xff0c;也就是说&#xff0c;我在用make编译成功后&#xff0c;再去做的源码编…...

2023爱分析·信创云市场厂商评估报告:中国电子云

01 研究范围定义 信创2.0时代开启&#xff0c;信创进程正在从局部到全面、从细分到所有领域延展。在这个过程中&#xff0c;传统的系统集成,也在逐步向信创化、数字化及智能化转变。随着信创产业的发展&#xff0c;企业需要更多的技术支持和服务&#xff0c;而传统的系统集成已…...

网络安全学习笔记——XFF攻击流程

手工注入 手动报错注入&#xff0c;填写格式如&#xff1a;X-Forwarded-For: and updatexml(1,concat(0x7e,(select database()),0x7e),1) or 11 库名 1 and updatexml(1,concat(0x7e,database(),0x7e),1), 表名 1 and updatexml(1,concat(0x7e,(select table_name from…...

微信小程序阻止用户返回上一页,并弹窗给用户确定是否要返回上一页

在onload中调用微信的enableAlertBeforeUnload方法&#xff0c;在首次进入会自动监听当前的页面&#xff0c;在返回的时候会自动弹出弹窗阻止用户返回上一页&#xff0c;点击确定则返回上一页&#xff0c;取消则停留在当前页 onLoad: function(){wx.enableAlertBeforeUnload({…...

LangChain+ChatGLM整合LLaMa模型(二)

开源大模型语言LLaMa LLaMa模型GitHub地址添加LLaMa模型配置启用LLaMa模型 LangChainChatGLM大模型应用落地实践&#xff08;一&#xff09; LLaMa模型GitHub地址 git lfs clone https://huggingface.co/huggyllama/llama-7b添加LLaMa模型配置 在Langchain-ChatGLM/configs/m…...

【NLP】训练chatglm2的评价指标BLEU,ROUGE

当进行一定程度的微调后&#xff0c;要评价模型输出的语句的准确性。由于衡量的对象是一个个的自然语言文本&#xff0c;所以通常会选择自然语言处理领域的相关评价指标。这些指标原先都是用来度量机器翻译结果质量的&#xff0c;并且被证明可以很好的反映待评测语句的准确性&a…...

java+springboot+mysql员工工资管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的员工工资管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、员工角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;部门管理&#xff1b;员工管理&#xff1b;奖惩管理&…...

FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版

FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版是一个完整的软件音乐制作环境或数字音频工作站&#xff08;DAW&#xff09;。它代表了 25 多年的创新发展&#xff0c;将您创作、编曲、录…...

探索Python数据容器之乐趣:列表与元组的奇妙旅程!

文章目录 零 数据容器入门一 数据容器&#xff1a;list(列表)1.1 列表的定义1.2 列表的下表索引1.3 列表的常用操作1.3.1 列表的查询功能1.3.2 列表的修改功能1.3.3 列表常用方法总结 1.4 补充&#xff1a;append与extend对比1.5 list&#xff08;列表&#xff09;的遍历1.6 补…...

Python自动化实战之使用Pytest进行API测试详解

概要 每次手动测试API都需要重复输入相同的数据&#xff0c;而且还需要跑多个测试用例&#xff0c;十分繁琐和无聊。那么&#xff0c;有没有一种方法可以让你更高效地测试API呢&#xff1f;Pytest自动化测试&#xff01;今天&#xff0c;小编将向你介绍如何使用Pytest进行API自…...

TCP的三次握手以及四次断开

TCP的三次握手和四次断开&#xff0c;就是TCP通信建立连接以及断开的过程 目录 【1】TCP的三次握手过程 ---- TCP建立连接的过程 【2】TCP的四次挥手 ---- TCP会话的断开 注意&#xff1a; 【1】TCP的三次握手过程 ---- TCP建立连接的过程 三次握手的过程&#xff1a…...

目标检测YOLO实战应用案例100讲-基于视觉与激光雷达信息融合的智能车辆目标检测研究

目录 前言 传感器选型及同步 2.1 各传感器工作原理及性能对比 2.1.1 视觉传感器...

开发实战:asp.net core + ef core 实现动态可扩展的分页方案

统一请求参数先定义一个公共的 QueryParameters 解决这个问题&#xff1a;public class QueryParameters{private const int MaxPageSize 100;private int _pageSize 10;public int PageNumber { get; set; } 1;// 限制最大值&#xff0c;防止前端传一个很大数值把数据库搞崩…...

OmenSuperHub:惠普游戏本性能释放与风扇控制的轻量级解决方案

OmenSuperHub&#xff1a;惠普游戏本性能释放与风扇控制的轻量级解决方案 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度&#xff0c;自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 当你在激烈的游戏对战中遭遇突然…...

GPU与CPU差异分析

在人工智能、高性能计算和图形渲染等领域的快速发展推动下,GPU与CPU这两种处理器架构正经历前所未有的变革与融合。本文将从基本概念、架构差异、应用场景及未来发展趋势等维度,系统分析GPU与CPU的协同关系与各自优势,为读者提供全面的技术洞察。 一、基本概念与历史演进 …...

避开这5个坑!用MCSM面板部署我的世界服务器时90%人会犯的错误

避开这5个坑&#xff01;用MCSM面板部署我的世界服务器时90%人会犯的错误 搭建《我的世界》服务器本应是充满乐趣的体验&#xff0c;但很多玩家在使用MCSM面板时却频频踩坑。我曾帮助超过200位用户成功部署服务器&#xff0c;发现90%的问题都集中在几个关键环节。本文将揭示这些…...

WSL2 子系统配置 SSH 并实现 VSCode 远程开发

1. 为什么要在WSL2中配置SSH服务&#xff1f; 作为一个长期使用WSL2进行开发的程序员&#xff0c;我发现直接通过终端操作WSL2虽然方便&#xff0c;但在某些场景下还是存在局限性。比如当需要同时管理多个项目时&#xff0c;终端窗口切换就显得不够高效&#xff1b;再比如团队协…...

ok-ww:用智能自动化重构鸣潮游戏体验

ok-ww&#xff1a;用智能自动化重构鸣潮游戏体验 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 痛点解析&#xff1a;当代游戏玩家…...

完全掌控:揭秘G-Helper如何解决华硕笔记本散热与性能调节难题

完全掌控&#xff1a;揭秘G-Helper如何解决华硕笔记本散热与性能调节难题 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, St…...

3分钟解锁B站缓存:m4s-converter让视频播放不再受限

3分钟解锁B站缓存&#xff1a;m4s-converter让视频播放不再受限 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否遇到过这样的情况&#xf…...

从树莓派到旧笔记本:利用Ubuntu 16.04 + CH340打造你的低成本硬件调试终端

从树莓派到旧笔记本&#xff1a;打造高性价比硬件调试终端的完整指南 在创客和硬件开发的世界里&#xff0c;调试工具的重要性不亚于开发板本身。想象一下&#xff1a;当你正在为一个物联网项目调试ESP32&#xff0c;或者为机器人项目编写Arduino代码时&#xff0c;一个稳定可靠…...

保姆级教程:用Node.js搭建WebSocket中继,让ESP32-CAM视频在另一块ESP32屏幕上实时播放

从零构建ESP32-CAM视频中继系统&#xff1a;WebSocket与Node.js的深度实践 想象一下这样的场景&#xff1a;工厂里的巡检机器人通过摄像头捕捉设备状态&#xff0c;实时传输到工程师的监控屏幕&#xff1b;或是智能家居中的安防摄像头&#xff0c;将画面无缝推送到多个终端。这…...