首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go程序例子(41):WaitGroup

Go程序例子(41):WaitGroup

原创
作者头像
用户11078756
发布2024-12-18 10:12:12
发布2024-12-18 10:12:12
1890
举报
文章被收录于专栏:go程序例子go程序例子

为了等待多个 goroutines 完成,我们可以使用 WaitGroup。

代码语言:go
复制
package main

import (
    "fmt"
    "sync"
    "time"
)
// 这是我们将在每个 goroutine 中运行的函数。
func worker(id int) {
    fmt.Printf("Worker %d starting\n", id)
	// 通过睡眠来模拟一个耗时的任务。
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}

func main() {
	// 这个 WaitGroup 用于等待这里启动的所有 goroutines 完成。注意:如果 WaitGroup 被显式传递到函数中,它应该通过指针传递。
    var wg sync.WaitGroup
	// 启动多个 goroutines,并为每个 goroutine 增加 WaitGroup 的计数器。
    for i := 1; i <= 5; i++ {
        wg.Add(1)
		// 将 worker 调用包装在一个闭包中,确保在 worker 完成时通知 WaitGroup。这样,worker 本身就不需要关心其执行过程中涉及的并发原语。
        go func() {
            defer wg.Done()
            worker(i)
        }()
    }
	// 阻塞直到 WaitGroup 计数器回到 0;所有 worker 都已通知它们完成。
    wg.Wait()
	// 请注意,这种方法没有直接的方式来传播 worker 的错误。对于更复杂的用例,可以考虑使用 errgroup 包。
}

运行结果:

代码语言:javascript
复制
$ go run waitgroups.go
Worker 5 starting
Worker 3 starting
Worker 4 starting
Worker 1 starting
Worker 2 starting
Worker 4 done
Worker 1 done
Worker 2 done
Worker 5 done
Worker 3 done

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档