3.22 Go之等待组

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()函数的返回去停止阻塞

posted @   俊king  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示