MST

星途 面试题库

面试题:Go函数异步调用中的并发控制

请使用Go语言实现一个函数异步调用的示例,其中有5个异步函数同时执行,并且需要确保最终所有异步函数执行完毕后再进行结果汇总输出。同时说明如何使用`WaitGroup`来实现并发控制。
33.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

// 模拟异步函数
func asyncFunction(i int, wg *sync.WaitGroup) int {
    defer wg.Done()
    fmt.Printf("异步函数 %d 开始执行\n", i)
    // 模拟一些工作
    result := i * 2
    fmt.Printf("异步函数 %d 执行结束,结果为 %d\n", i, result)
    return result
}

func main() {
    var wg sync.WaitGroup
    results := make([]int, 5)

    // 设置WaitGroup计数器为5,因为有5个异步函数
    wg.Add(5)

    for i := 0; i < 5; i++ {
        go func(index int) {
            results[index] = asyncFunction(index, &wg)
        }(i)
    }

    // 等待所有异步函数完成
    wg.Wait()

    // 汇总输出结果
    fmt.Println("所有异步函数执行完毕,汇总结果:")
    for _, result := range results {
        fmt.Printf("%d ", result)
    }
    fmt.Println()
}

使用WaitGroup实现并发控制说明:

  1. 初始化计数器:通过wg.Add(n)方法设置WaitGroup的计数器为n,这里n是需要并发执行的函数数量,即5个异步函数,所以wg.Add(5)
  2. 标记任务完成:在每个异步函数内部,使用defer wg.Done(),这样当函数执行结束时,会将WaitGroup的计数器减1。
  3. 等待所有任务完成:在主函数中,使用wg.Wait(),这个方法会阻塞当前goroutine,直到WaitGroup的计数器变为0,即所有异步函数都执行完毕,此时就可以进行结果汇总等后续操作。