sync.WaitGroup的用法及说明

 更新时间:2025年07月28日 08:59:12   作者:你是我的幸运儿  
Go语言中WaitGroup用于同步goroutine,Add设置计数器,Done减1,Wait阻塞直到计数器归零,示例显示并发执行结果顺序随机,但整体完成后输出over

sync.WaitGroup的用法

WaitGroup在go语言中,用于线程同步,单从字面意思理解,wait等待的意思,group组、团队的意思,WaitGroup就是指等待一组,等待一个系列执行完成后才会继续向下执行。

WaitGroup能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。

WaitGroup总共有三个方法

Add(delta int),Done(),Wait()

简单的说一下这三个方法的作用。

  • Add:添加或者减少等待goroutine的数量;
  • Done:相当于Add(-1);
  • Wait:执行阻塞,直到所有的WaitGroup数量变成 0;

如图:WatiGroup的定义

google官方示例

package main

import (
    "fmt"
    "sync"
    "net/http"
)

func main() {
    var wg sync.WaitGroup
    var urls = []string{
            "http://www.golang.org/",
            "http://www.google.com/",
            "http://www.baiyuxiong.com/",
    }
    for _, url := range urls {
            // Increment the WaitGroup counter.
            wg.Add(1)
            // Launch a goroutine to fetch the URL.
            go func(url string) {
                    // Decrement the counter when the goroutine completes.
                    defer wg.Done()
                    // Fetch the URL.
                    http.Get(url)
            fmt.Println(url);
            }(url)
    }
    // Wait for all HTTP fetches to complete.
    wg.Wait()
    fmt.Println("over");
}

代码执行结果为:

http://www.baiyuxiong.com/
http://www.google.com/
http://www.golang.org/
over

从执行结果可看出:

1、取三个网址信息的时候,结果显示顺序与for循环的顺序没有必然关系。

2、三个goroutine全部执行完成后,wg.Wait()才停止等待,继续执行并打印出over字符。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Golan中 new() 、 make() 和简短声明符的区别和使用

    Golan中 new() 、 make() 和简短声明符的区别和使用

    Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射和通道,并返回初始化后的对象,简短声明符:=可以简化变量声明和初始化过程,感兴趣的朋友一起看看吧
    2025-01-01
  • GO语言开发终端命令行小工具改进更新

    GO语言开发终端命令行小工具改进更新

    这篇文章主要为大家介绍了GO语言开发终端命令行小工具的改进更新,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 详解golang中make与new的异同点和用法

    详解golang中make与new的异同点和用法

    这篇文章将给大家介绍了go语言中函数new与make的使用和区别,关于go语言中new和make是内建的两个函数,主要用来创建分配类型内存,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-01-01
  • Golang设计模式之适配器模式介绍和代码示例

    Golang设计模式之适配器模式介绍和代码示例

    适配器是一种结构型设计模式, 它能使不兼容的对象能够相互合作,可担任两个对象间的封装器, 它会接收对于一个对象的调用, 并将其转换为另一个对象可识别的格式和接口,本文将通过代码示例详细给大家介绍Golang的适配器模式
    2023-06-06
  • Go语言接口与多态详细介绍

    Go语言接口与多态详细介绍

    Go语言的接口类型是一组方法定义的集合,它体现了多态性、高内聚和低耦合的设计思想,接口通过interface关键字定义,无需实现具体方法,任何实现了接口所有方法的类型即视为实现了该接口,感兴趣的朋友一起看看吧
    2024-09-09
  • Go Mongox轻松实现MongoDB的时间字段自动填充

    Go Mongox轻松实现MongoDB的时间字段自动填充

    这篇文章主要为大家详细介绍了Go语言如何使用 mongox 库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以参考下
    2025-02-02
  • GoLang channel底层代码实现详解

    GoLang channel底层代码实现详解

    Channel和goroutine的结合是Go并发编程的大杀器。而Channel的实际应用也经常让人眼前一亮,通过与select,cancel,timer等结合,它能实现各种各样的功能。接下来,我们就要梳理一下GoLang channel底层代码实现
    2022-10-10
  • 详解Go语言中Validator库的使用方法和用途

    详解Go语言中Validator库的使用方法和用途

    github.com/go-playground/validator 是一个 Go 语言的库,用于对结构体字段进行验证,它提供了一种简单而灵活的方式来定义验证规则,在这篇文章中,我们将从一个简单的问题出发,带你了解 Validator 库的用途,也会介绍Validator 的基本使用
    2023-09-09
  • 深入Go goroutine理解

    深入Go goroutine理解

    这篇文章主要介绍了深入Go goroutine理解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 使用Gorm操作Oracle数据库踩坑记录

    使用Gorm操作Oracle数据库踩坑记录

    gorm是目前用得最多的go语言orm库,本文主要介绍了使用Gorm操作Oracle数据库踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论