实现思路
- 定义一个
WaitGroup
变量,用于等待所有协程完成。
- 为每个负责从远程服务器获取数据的Go协程启动时调用
WaitGroup
的Add(1)
方法,增加等待计数。
- 每个协程完成数据获取后,调用
WaitGroup
的Done()
方法,减少等待计数。
- 在主协程中,使用
WaitGroup
的Wait()
方法阻塞,直到所有协程的等待计数为0,即所有协程都完成数据获取。
- 所有协程完成后,对获取到的数据进行汇总处理并返回。
核心代码片段
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)
}