0
点赞
收藏
分享

微信扫一扫

golang协程数据返回并聚合

协程操作

//创建数据处理协程池,并发协程获取到的数据添加至此channel中,供聚合结果的协程取用
responseChannel := make(chan *trafficMapTypes.CountDetailResp, 50)
//创建一个最大并发连接数为50的协程池
c := make(chan struct{}, 50)
defer close(c)
//创建并发控制
wg := &sync.WaitGroup{}
wg.Add(len(appEndpointMap))
// 为读取结果控制器创建新的WaitGroup, 需要保证控制器内的所有值都已经正确处理完毕, 才能结束
wgResponse := &sync.WaitGroup{}
go func() {
// wgResponse计数器+1
wgResponse.Add(1)
for rc := range responseChannel {
//将端点信息添加至返回请求体中
resp = append(resp, rc)
}
// 当 responseChannel被关闭时且channel中所有的值都已经被处理完毕后, 将执行到这一行
wgResponse.Done()
}()

//查询各个端点的详细调用信息
for _, appEndpoint := range appEndpointMap {
c <- struct{}{}
go func(appEndpoint *trafficMapTypes.Endpoint) {
endpointDetail := new(trafficMapTypes.CountDetailResp)
/**
若干业务逻辑
**/
//数据添加至channel中
responseChannel <- endpointDetail
//释放协程池中的一个坑位
<-c
//并发控制计数器-1
wg.Done()
}(appEndpoint)
}
wg.Wait()
// 关闭接收结果channel
close(responseChannel)
// 等待wgResponse的计数器归零
wgResponse.Wait()

最后的​resp​​即为聚合后的数据

耗时统计

package main

import (
"fmt"
"time"
)

func sum(n int) int {
startT := time.Now() //计算当前时间

total := 0
for i:=1; i <= n; i++ {
total += i
}

tc := time.Since(startT) //计算耗时
fmt.Printf("time cost = %v\n", tc)
return total
}

func main() {
count := sum(100)
fmt.Printf("count = %v\n", count)
}

举报

相关推荐

0 条评论