📜  在Golang中使用WaitGroup(1)

📅  最后修改于: 2023-12-03 15:07:53.195000             🧑  作者: Mango

在 Golang 中使用 WaitGroup

在编写并发程序时,经常需要等待所有 goroutine 完成后再继续执行下一步操作。Go 语言的 sync.WaitGroup 可以帮助我们达到这个目的。

WaitGroup 的作用

WaitGroup 可以用来等待一组 goroutine 完成它们的工作。当你启动了一组 goroutine 时,你可以调用 Add(n int) 方法来增加计数器的值,表示有 n 个 goroutine 需要完成。当每个 goroutine 完成工作时,可以调用 Done() 方法来减少计数器的值。当计数器的值变为 0 时,Wait() 方法将立即返回,表示所有 goroutine 都已经完成。

WaitGroup 的使用

这里我们来看一个例子,它使用 WaitGroup 来等待一组 goroutine 完成:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // 减少计数器的值

    fmt.Printf("Worker %d starting\n", id)
    // 等待某些事情完成…
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup // 声明 WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1) // 增加计数器的值
        go worker(i, &wg)
    }

    wg.Wait() // 等待所有 goroutine 完成
    fmt.Println("All workers done.")
}

在上面的例子中,我们声明了一个 WaitGroup,然后在 for 循环内将计数器的值增加,指示有五个 goroutine 需要完成。然后,在每个 goroutine 中,我们调用了 wg.Done() 来减少计数器的值,表示这个 goroutine 已经完成了它的工作。最后,我们在 main 函数中调用了 wg.Wait(),它会一直阻塞,直到计数器的值变为 0,表示所有 goroutine 都已经完成。

输出应该类似于:

Worker 1 starting
Worker 5 starting
Worker 4 starting
Worker 2 starting
Worker 3 starting
Worker 5 done
Worker 1 done
Worker 4 done
Worker 2 done
Worker 3 done
All workers done.
总结

WaitGroup 可以确保一组 goroutine 都已经完成它们的工作后再开始执行下一步操作。它是 Go 语言中一个简单而强大的并发工具,可以帮助您写出更高效、更可靠的并发程序。