MST

星途 面试题库

面试题:Go 中 WaitGroup 如何在多协程并发场景下保证任务同步完成

假设有一个任务列表,每个任务都是一个独立的函数调用,需要在 Go 中使用 WaitGroup 来确保所有任务都完成后再继续执行主程序。请编写示例代码实现该功能,并解释 WaitGroup 的主要方法在代码中的作用。
47.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

// 模拟任务函数
func task(wg *sync.WaitGroup, id int) {
    defer wg.Done()
    fmt.Printf("Task %d is running\n", id)
}

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

    // 设置WaitGroup的计数器,其Add方法用于设置等待的任务数量
    wg.Add(numTasks)

    for i := 1; i <= numTasks; i++ {
        // 启动一个新的goroutine执行任务
        go task(&wg, i)
    }

    // 等待所有任务完成,Wait方法会阻塞当前goroutine,直到WaitGroup的计数器归零
    wg.Wait()

    fmt.Println("All tasks are completed")
}

WaitGroup主要方法在代码中的作用:

  1. Add方法:在main函数中,wg.Add(numTasks) 用于设置 WaitGroup 的计数器的值为任务的数量。这个计数器表示需要等待完成的任务数。如果不调用 Add 方法或者调用的参数不正确,Wait 方法的行为将不可预测。
  2. Done方法:在 task 函数中,defer wg.Done() 用于将 WaitGroup 的计数器减1。通常在任务完成时调用此方法,告知 WaitGroup 一个任务已经完成。如果忘记调用 Done 方法,Wait 方法可能会永远阻塞。
  3. Wait方法:在 main 函数中,wg.Wait() 会阻塞当前的 goroutine(即 main 函数所在的 goroutine),直到 WaitGroup 的计数器归零,也就是所有任务都调用了 Done 方法。这样可以确保在所有任务完成后,main 函数才继续执行后续代码。