MST
星途 面试题库

面试题:Go中WaitGroup在复杂并发场景下的应用

假设有一个场景,需要并发执行多个任务,其中部分任务依赖于其他任务的结果。请使用WaitGroup来设计并实现这个并发控制逻辑,描述你的设计思路和代码实现过程。
40.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 任务划分:明确哪些任务是独立的,哪些任务依赖其他任务的结果。
  2. 使用WaitGroup:为每个独立任务创建一个goroutine,并使用WaitGroup来等待所有任务完成。
  3. 数据传递:对于有依赖关系的任务,通过通道(channel)或共享变量来传递任务结果。

代码实现过程

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    // 独立任务1
    wg.Add(1)
    var result1 int
    go func() {
        defer wg.Done()
        result1 = 10 // 模拟任务执行结果
    }()

    // 依赖任务1结果的任务2
    wg.Add(1)
    var result2 int
    go func() {
        defer wg.Done()
        wg.Wait() // 等待任务1完成
        result2 = result1 * 2 // 使用任务1的结果
    }()

    wg.Wait() // 等待所有任务完成
    fmt.Printf("Result1: %d, Result2: %d\n", result1, result2)
}

在上述代码中:

  1. 首先为独立任务1和依赖任务1结果的任务2分别添加到WaitGroup中。
  2. 独立任务1在goroutine中执行并计算出结果result1
  3. 任务2在goroutine中,先使用wg.Wait()等待任务1完成,然后获取result1并计算出result2
  4. 最后,主goroutine使用wg.Wait()等待所有任务完成,并输出结果。