草庐IT

errgroup

全部标签

errgroup的常见误用

errgroup想必稍有经验的golang程序员都应该听说过,实际项目中用过的也应该不在少数。它和sync.WaitGroup类似,都可以发起执行并等待一组协程直到所有协程运行结束。除此之外errgroup还可以在协程出错时取消当前的context,以及它还能控制可运行的协程的数量。但在日常的代码review时我注意到了几个比较常见的问题,这些问题有的无伤大雅最多只会造成一些性能损失,有的则会导致资源泄露甚至是死锁崩溃。这里对这些比较典型的误用做下记录。多余的context嵌套先说个不是很常见但我还是遇到过两三次的不太妥当的用法。我们知道errgroup在协程返回错误的时候会取消掉创建时传入的

浅谈errgroup的使用以及源码分析

本文讲解的是golang.org/x/sync这个包中的errgroup1、errgroup的基础介绍学习过Go的朋友都知道Go实现并发编程是比较容易的事情,只需要使用go关键字就可以开启一个goroutine。那对于并发场景中,如何实现goroutine的协调控制呢?常见的一种方式是使用sync.WaitGroup来进行协调控制。使用过sync.WaitGroup的朋友知道,sync.WaitGroup虽然可以实现协调控制,但是不能传递错误,那该如何解决呢?聪明的你可能马上想到使用chan或者是context来传递错误,确实是可以的。那接下来,我们一起看看官方是怎么实现上面的需求的呢?1.1

golang中的errgroup

0.1、索引https://waterflow.link/articles/16652399000041、串行执行假如我们需要查询一个课件列表,其中有课件的信息,还有课件创建者的信息,和课件的缩略图信息。但是此时我们已经对服务做了拆分,假设有课件服务和用户服务还有文件服务。我们通常的做法是,当我们查询课件列表时,我们首先调用课件服务,比如查询10条课件记录,然后获取到课件的创建人ID,课件的缩略图ID;再通过这些创建人ID去用户服务查询用户信息,通过缩略图ID去文件服务查询文件信息;然后再写到这10条课件记录中返回给前端。像下面这样:packagemainimport( "fmt" "time

golang中的errgroup

0.1、索引https://waterflow.link/articles/16652399000041、串行执行假如我们需要查询一个课件列表,其中有课件的信息,还有课件创建者的信息,和课件的缩略图信息。但是此时我们已经对服务做了拆分,假设有课件服务和用户服务还有文件服务。我们通常的做法是,当我们查询课件列表时,我们首先调用课件服务,比如查询10条课件记录,然后获取到课件的创建人ID,课件的缩略图ID;再通过这些创建人ID去用户服务查询用户信息,通过缩略图ID去文件服务查询文件信息;然后再写到这10条课件记录中返回给前端。像下面这样:packagemainimport( "fmt" "time