MST

星途 面试题库

面试题:Go中WaitGroup在分布式系统基础应用

在一个简单的分布式任务模拟场景中,有多个Go协程负责从不同的远程服务器获取数据。请使用Go的WaitGroup来确保所有协程完成数据获取后,再将这些数据进行汇总处理并返回。描述你的实现思路,并给出核心代码片段。
26.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义一个WaitGroup变量,用于等待所有协程完成。
  2. 为每个负责从远程服务器获取数据的Go协程启动时调用WaitGroupAdd(1)方法,增加等待计数。
  3. 每个协程完成数据获取后,调用WaitGroupDone()方法,减少等待计数。
  4. 在主协程中,使用WaitGroupWait()方法阻塞,直到所有协程的等待计数为0,即所有协程都完成数据获取。
  5. 所有协程完成后,对获取到的数据进行汇总处理并返回。

核心代码片段

package main

import (
    "fmt"
    "sync"
)

// 模拟从远程服务器获取数据的函数
func fetchData(server string, wg *sync.WaitGroup, resultChan chan string) {
    defer wg.Done()
    // 实际中这里应该是从远程服务器获取数据的逻辑
    data := fmt.Sprintf("Data from %s", server)
    resultChan <- data
}

func main() {
    servers := []string{"Server1", "Server2", "Server3"}
    var wg sync.WaitGroup
    resultChan := make(chan string, len(servers))

    for _, server := range servers {
        wg.Add(1)
        go fetchData(server, &wg, resultChan)
    }

    go func() {
        wg.Wait()
        close(resultChan)
    }()

    var aggregatedData string
    for data := range resultChan {
        aggregatedData += data + " "
    }

    fmt.Println("Aggregated Data:", aggregatedData)
}