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

Golang 函数如何使用WaitGroup来协调并发任务?

PHPz
发布: 2024-10-06 10:27:02
原创
658人浏览过

waitgroup协调并发任务:创建 waitgroup:创建一个waitgroup数据结构来跟踪并发任务。加入任务:在每个并发任务开始时,调用add(1)增加计数器。完成任务:当任务完成时,调用done()减少计数器。等待完成:在主任务中,调用wait()阻塞,直到所有任务完成,确保数据一致性。

Golang 函数如何使用WaitGroup来协调并发任务?

GoLang 函数中使用 WaitGroup 协调并发任务

简介

当在 Go 中使用并发特性时,经常需要协调多个并发执行的任务。WaitGroup 是一种同步机制,用于等待一组并发的 goroutine 完成他们的任务。

WaitGroup 的用法

WaitGroup 是一个用于管理并发的 goroutine 组的数据结构。它包含两个主要字段:

  • Counter:一个计数器,跟踪正在等待完成的 goroutine 数。
  • Wait:一个 channel,用于阻塞直到所有 goroutine 完成。

要使用 WaitGroup,请执行以下步骤:

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

  1. 创建一个新的 WaitGroup:

    import "sync/atomic"
    
    var wg sync.WaitGroup
    登录后复制
  2. 在每个要等待的 goroutine 中,调用 Add(1) 方法以增加计数器:

    wg.Add(1)
    登录后复制
  3. 当 goroutine 完成时,调用 Done() 方法以减少计数器:

    wg.Done()
    登录后复制
  4. 在主 goroutine 中,调用 Wait() 方法阻塞,直到所有 goroutine 完成。

    wg.Wait()
    登录后复制

实战案例

让我们考虑一个打印数字列表的并发程序。主 goroutine 创建一组 goroutine,每个 goroutine 打印列表中的一组数字。

package main

import (
    "fmt"
    "os"
    "runtime"
    "strconv"
    "sync"
)

func main() {
    // 创建 WaitGroup
    var wg sync.WaitGroup

    // 获取CPU核心数
    numCores := runtime.NumCPU()

    // 分配任务给 goroutine 组
    for i := 0; i < numCores; i++ {
        from := i * 10
        to := (i + 1) * 10
        wg.Add(1)
        go printNumbers(wg, from, to)
    }

    // 等待所有 goroutine 完成
    wg.Wait()

    fmt.Println("所有数字已打印。")
}

// printNumbers 打印一组数字
func printNumbers(wg sync.WaitGroup, from, to int) {
    defer wg.Done()

    for i := from; i < to; i++ {
        fmt.Fprintf(os.Stdout, "%d ", i)
    }
}
登录后复制

在这个示例中,主 goroutine 创建了一个 WaitGroup 并调用 Add(1) 方法,为每个 goroutine 增加计数器。然后,它创建一组 goroutine,每个 goroutine调用 printNumbers 函数打印一组数字。

printNumbers 函数每打印一组数字就会减少计数器。当所有 goroutine 完成时,主 goroutine 调用 Wait() 方法等待所有 goroutine 完成。这确保了列表中的所有数字都被打印出来,并且不存在goroutine竞争条件。

以上就是Golang 函数如何使用WaitGroup来协调并发任务?的详细内容,更多请关注php中文网其它相关文章!

豆包AI编程
豆包AI编程

智能代码生成与优化,高效提升开发速度与质量!

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

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