MST

星途 面试题库

面试题:Go中如何使用WaitGroup实现Goroutine的并发控制

请描述Go语言中WaitGroup的使用场景,并给出一个简单示例代码,展示如何使用WaitGroup等待一组Goroutine完成工作。
13.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

WaitGroup使用场景

在Go语言中,WaitGroup主要用于协调多个Goroutine,使得主Goroutine(或其他Goroutine)能够等待一组Goroutine全部完成工作后再继续执行。常用于以下场景:

  1. 并发任务处理:当需要同时启动多个Goroutine执行不同任务,并且要在所有任务完成后进行后续操作时,例如批量数据处理、并行I/O操作等。
  2. 服务启动与关闭:在启动多个服务组件(每个组件在独立的Goroutine中运行)时,等待所有组件启动完成;或者在关闭服务时,等待所有正在运行的Goroutine完成清理工作。

示例代码

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d starting\n", id)
    // 模拟一些工作
    //time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup
    numWorkers := 3

    for i := 1; i <= numWorkers; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }

    fmt.Println("Waiting for all workers to finish...")
    wg.Wait()
    fmt.Println("All workers have finished.")
}

在上述代码中:

  1. worker函数是一个在Goroutine中执行的函数,它接收一个id*sync.WaitGroup指针。在函数结束时调用wg.Done(),表示该Goroutine的工作已经完成。
  2. main函数中,初始化了一个WaitGroup。通过循环启动了numWorkers个Goroutine,每个Goroutine启动前调用wg.Add(1),表示有一个新的任务需要等待。
  3. 调用wg.Wait()main函数会阻塞在这里,直到所有Goroutine都调用了wg.Done(),即所有任务完成,然后继续执行后续代码。