Go语言并发编程: 使用sync.WaitGroup实现goroutine同步

Go语言并发编程: 使用sync.WaitGroup实现goroutine同步

编码文章call10242025-02-21 12:18:479A+A-

sync.WaitGroup是一个同步原语,用于等待一组并发任务结束。它常用于并发程序中,让主程序在启动一组goroutine后等待它们结束。主要作用是:在并发程序启动一组任务后,等待它们全部结束,以防止程序退出时仍有任务没有完成。

用法示例如下:

go
package main

import (
    "sync"
    "fmt"
)

func main() {
    var wg sync.WaitGroup
    
    //启动3个goroutine,并递增waitgroup计数器
    wg.Add(3) 
    go func() {
        defer wg.Done() //goroutine结束时递减计数器
        fmt.Println("1st goroutine sleeping...")
        time.Sleep(1)
    }()
    go func() {
        defer wg.Done()
        fmt.Println("2nd goroutine sleeping...")
        time.Sleep(2)
    }()
    go func() {
        defer wg.Done()
        fmt.Println("3rd goroutine sleeping...")
        time.Sleep(3)
    }()
    
    //等待所有goroutine结束 
    wg.Wait() 
    fmt.Println("All goroutines complete.")
}

输出:

1st goroutine sleeping... 
2nd goroutine sleeping...
3rd goroutine sleeping...
All goroutines complete.

整个流程如下:

1. 主程序启动3个goroutine,并调用wg.Add(3)将waitgroup计数器设置为3.

2. 每个goroutine结束时调用defer wg.Done()递减计数器。

3. 主程序调用wg.Wait()进行等待。

4. 等待所有goroutine调用wg.Done()将计数器减到0。

5. wg.Wait()函数返回,程序继续执行。

6. 最后输出"All goroutines complete."。

所以WaitGroup用于让主程序等待一组goroutine结束,实现了阻塞直至所有任务结束的效果。这在并发程序的结尾处尤为重要,可以避免主程序过早退出导致任务没有完成。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4