MST

星途 面试题库

面试题:Go中WaitGroup在复杂任务依赖编排里的应用

现在有一组任务,任务A需要先执行,任务B和C需要等待A执行完成后并发执行,任务D需要等待B和C都执行完成后再执行。请使用Go的WaitGroup进行任务编排并实现,分析这种场景下WaitGroup相较于其他同步机制的优势与劣势。
23.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    // 执行任务A
    wg.Add(1)
    go func() {
        defer wg.Done()
        fmt.Println("执行任务A")
    }()

    // 等待任务A完成
    wg.Wait()

    // 并发执行任务B和C
    wg.Add(2)
    go func() {
        defer wg.Done()
        fmt.Println("执行任务B")
    }()
    go func() {
        defer wg.Done()
        fmt.Println("执行任务C")
    }()

    // 等待任务B和C完成
    wg.Wait()

    // 执行任务D
    fmt.Println("执行任务D")
}

WaitGroup优势

  1. 简单易用:通过AddDoneWait方法,可以很直观地实现任务的同步等待,对于这种简单的任务编排场景,代码逻辑清晰。
  2. 轻量级:在Go语言的并发模型中,WaitGroup相对轻量级,开销较小。

WaitGroup劣势

  1. 功能局限性:只能用于简单的任务等待场景,如果需要更复杂的同步逻辑,如条件变量(Cond)、读写锁(RWMutex)等实现的功能,WaitGroup无法满足。
  2. 缺乏灵活性:不适合处理动态变化的等待条件,例如需要在等待过程中动态增加等待的任务数量,WaitGroup使用起来会比较困难。