wait group 通常用来等待一组 goroutine 完成工作。
wait group 维护了一个 counter,并且依据 counter 的数字来控制 goroutine。透过三个操作来控制
Add(delta int)
: 将 counter 加 delta。如果 counter 变为 0,被 Wait() 所挡住的 goroutine 将会放行。Done()
: 将 conter 减 1,其实它的实作就是 Add(-1)。Wait()
: 一直等待,直到 counter 变为 0。以下给一个程序的例子,定义一个 worker,并且让五个 worker 做事,五个 worker 做完事情後,counter 一定为 0,这时正在 wait 的 main goroutine 才会继续执行。
func worker(id int) {
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
i := i
go func() {
defer wg.Done()
worker(i)
}()
}
wg.Wait()
}
在 go 里很常使用到错误处理,但是 wait group 本身并没有支援错误处理流程,自己设计错误处理又很容易犯错。errgroup package 就可以解决这个问题。而且 errgroup 同时支援 context 的做法,下一次就来写 errgroup 吧
接下来我们来谈谈 MVP ( Model-View-Presenter ),在知道 MVC 也只是在...
Docker - Docker 执行 Maven 参考资料 Docker 指令参考: [小抄] Do...
这是 Roblox 从零开始系列,在效果章节的单元,今天你将学会如何透过粒子发射器来做出基本的粒子特...
昨天介绍了如何将资料显示在手机画面上,今天会介绍如何辨别点选到哪一个城市,以及将城市天气资讯回传到手...
如何编写有效的用户故事? 用户故事是一种捕捉早期需求的强大技术。用户故事捕捉了需求的 WHO、WHA...