登录
首页 >  Golang >  Go教程

GolangWaitGroup并发同步实战教程

时间:2025-10-20 13:12:37 317浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《Golang WaitGroup并发同步实战示例》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

WaitGroup用于等待多个goroutine完成,通过Add增加计数、Done减少计数、Wait阻塞直至归零,示例中并发下载网页并等待全部完成,需注意Add与Done配对、避免提前Wait及在goroutine内调用Done。

GolangWaitGroup实现并发任务同步示例

在Go语言中,WaitGroupsync 包提供的一个同步原语,用于等待一组并发的 goroutine 完成任务。它非常适合用于主协程需要等待多个子协程执行完毕后再继续的场景。

WaitGroup 基本用法

WaitGroup 有三个核心方法:

  • Add(n int):增加计数器,表示要等待的 goroutine 数量
  • Done():减少计数器,通常在 goroutine 结束时调用
  • Wait():阻塞主协程,直到计数器归零

下面是一个使用 WaitGroup 实现并发任务同步的简单示例:

并发下载多个网页

假设我们要并发地从多个 URL 下载内容,并等待所有下载完成:

package main

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

func fetch(url string, wg *sync.WaitGroup) {
    defer wg.Done() // 任务完成,计数器减1

    fmt.Printf("开始获取: %s\n", url)
    resp, err := http.Get(url)
    if err != nil {
        fmt.Printf("请求失败 %s: %v\n", url, err)
        return
    }
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Printf("成功获取 %s,响应长度: %d\n", url, len(body))
}

func main() {
    urls := []string{
        "https://httpbin.org/delay/1",
        "https://httpbin.org/status/200",
        "https://httpbin.org/headers",
    }

    var wg sync.WaitGroup

    for _, url := range urls {
        wg.Add(1)           // 每启动一个 goroutine,计数加1
        go fetch(url, &wg)  // 并发执行
    }

    wg.Wait() // 等待所有任务完成
    fmt.Println("所有任务已完成")
}

常见使用注意事项

使用 WaitGroup 时需要注意以下几点,避免出现死锁或 panic:

  • 确保每个 Add 都有对应的 Done,否则可能造成永久阻塞
  • 不要在 goroutine 外部调用 Done,应放在 goroutine 内部并通过指针传递 WaitGroup
  • 避免在 Add 调用之前就执行 Wait,否则可能漏掉某些任务
  • 建议使用 defer wg.Done() 确保即使发生 panic 也能正确计数

基本上就这些。WaitGroup 是实现简单并发控制非常实用的工具,适用于批量任务处理、并行计算等场景,掌握它的正确用法能有效提升 Go 程序的并发效率和稳定性。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>