3.22 Go之等待组
等待组的作用
进行多个任务的同步,保证在并发环境中完成指定数量的任务
等待组的结构特点以及可使用的函数
等待组属于sync.WaitGroup
类型.每个等待组内部维护一个技术,该计数初始默认值为零 等待组的函数:
方法名 | 功能 |
---|---|
(wg * WaitGroup) Add(delta int) | 等待组的计数器 +1 |
(wg * WaitGroup) Done() | 等待组的计数器 -1 |
(wg * WaitGroup) Wait() | 当等待组计数器不等于 0 时阻塞直到变 0。 |
函数的一些特点
-
wg.Add(delta)
改变wg
维护的计数 -
wg.Done()
和wg.Add(-1)
完全等价 -
wg.Wait()
函数:-
wg
维护的计数为0
,则wg.Wait()
操作为一个空操作(noop
) -
计数为正数,协程阻塞,其它某个协程将此计数更改至
0
时(一般通过调用wg.Done()
),此协程将重新进入运行状态(即wg.Wait()
将返回)
-
示例
等待组内部拥有一个计数器,计数器的值可以通过方法调用实现计数器的增加和减少。当我们添加了N
个并发任务进行工作时,就将等待组的计数器值增加N
。每个任务完成时,这个值减1
。同时,在另外一个goroutine
中等待这个等待组的计数器值为0
时,表示所有任务已经完成。
package main
import (
"fmt"
"net/http"
"sync"
)
/*
声明等待组
通过等待组控制并发去访问url
*/
func main() {
// 声明等待组
var wg sync.WaitGroup
// 准备网址数据
var urls = []string{
"https://www.baidu.com",
"https://www.cnblogs.com/JunkingBoy/",
"https://studygolang.com/interview/question",
}
// 遍历地址,使用匿名遍历
for _, url := range urls {
// 开启一个任务,等待组计数器+1
wg.Add(1)
// 并发进行资源地址访问
go func(url string) {
// 计数器处理
defer wg.Done()
// 使用http包下的函数访问资源地址
/*
使用 http 包提供的 Get() 函数对 url 进行访问,Get() 函数会一直阻塞直到网站响应或者超时。
*/
_, err := http.Get(url)
// 打印参数以及错误
fmt.Println(url, err)
}(url)
}
// 等待组等待
wg.Wait()
// 结束
fmt.Println("结束!")
}
总结
sync.WaitGroup
的目的是保证并发条件下完成一定数量的指定任务
实现原理:
通过计数器的加减判断是否完成任务,通过Wait()
It's a lonely road!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话