使用场景:微服务中的并发请求
并发编程是Golang语言的强大特性之一。在微服务架构中,面对用户的请求,我们常常需要向下游请求大量的数据继而组装成所需数据,不同的数据很可能会由不同的服务提供,这里一一请求显然是效率十分低效的,所以并发成为提高响应效率的优选方法。
errgroup库
基础版本安装
$ go get -u golang.org/x/sync/errgroup
加强版本https://github.com/go-kratos/kratos/tree/v1.0.x/pkg/sync/errgroup
演变历程
channel版本
res_ch := make(chan interface{},3)
go func() {
r := funA()
res_ch <- r
}()
go func() {
r := funB()
res_ch <- r
}()
go func() {
r := funC()
res_ch <- r
}()
res := make([]interface{},0,3)
for i := 0; i < 3; i++ {
data := <- res_ch
res = append(res,data)
}
此版本运用了官方推荐的用于goroutine通信的channel结构。预计完整接收goroutine的结果。
问题1:goroutine数量控制较为繁琐
问题2:若goroutine内部发生错误,会导致接收程序阻塞,无法正常退出
基本版本errgroup
源码
//源代码结构