Go语言学习之WaitGroup使用介绍

Go语言中的sync.WaitGroup用于管理并发任务,确保主线程等待所有子任务完成后再继续执行。通过Add()增加计数,Done()减少计数,Wait()阻塞直到计数为0。在并发编程中,WaitGroup提供了一种优雅的同步机制,避免了使用time.Sleep()可能导致的不准确性。示例展示了如何正确使用WaitGroup,强调了传址的重要性以避免死锁。
摘要由CSDN通过智能技术生成

Go语言学习之WaitGroup使用介绍

简介

  • 内容介绍

    WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量
    Add(n) 把计数器设置为n
    Done() 每次把计数器-1
    Wait() 会阻塞代码的运行,直到计数器地值减为0。

适用场景

  • 场景说明

    主线程等待所有线程执行结束再继续执行

使用样例

  • 反例

    主线程为了等待goroutine都运行完毕,不得不在程序的末尾使用time.Sleep() 来睡眠一段时间,等待其他线程充分运行。对于简单的代码,100个for循环可以在1秒之内运行完毕,time.Sleep() 也可以达到想要的效果。

    
        import (
            "fmt"
            "time"
        )
    
        func main(){
            for i := 0; i < 100 ; i++{
                go fmt.Println(i)
            }
            time.Sleep(time.Second)
        }
    
    
    
    
    
  • 正例

    这里首先把 wg 计数设置为100, 每个for循环运行完毕都把计数器减一,主函数中使用 Wait() 一直阻塞,直到wg为零——也就是所有的100个for循环都运行完毕。相对于使用主线程睡眠来说 WaitGroup 更合理。

    
    
        func main() {
            wg := sync.WaitGroup{}
            wg.Add(100)
            for i := 0; i < 100; i++ {
                go func(i int) {
                    fmt.Println(i)
                    wg.Done()
                }(i)
            }
            wg.Wait()
        }
    
    
    
    

注意事项

  • WaitGroup对象不是一个引用类型

    WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址

    
    
        func main() {
            wg := sync.WaitGroup{}
            wg.Add(100)
            for i := 0; i < 100; i++ {
                go f(i, &wg)
            }
            wg.Wait()
        }
    
        // 一定要通过指针传值,不然进程会进入死锁状态
        func f(i int, wg *sync.WaitGroup) { 
            fmt.Println(i)
            wg.Done()
        }
    
    
    

参考链接

  • Go 并发

    https://www.runoob.com/go/go-concurrent.html

  • Golang sync.WaitGroup的用法

    https://studygolang.com/articles/12972

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值