首页 > 后端开发 > Golang > 正文

GolangWaitGroup实现并发任务同步示例

P粉602998670
发布: 2025-09-26 20:19:01
原创
970人浏览过
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 下载内容,并等待所有下载完成:

芦笋演示
芦笋演示

一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。

芦笋演示 34
查看详情 芦笋演示

立即学习go语言免费学习笔记(深入)”;

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 程序的并发效率和稳定性。

以上就是GolangWaitGroup实现并发任务同步示例的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号