注:本文已发布超过一年,请注意您所使用工具的相关版本是否适用
本系列为 Go 进阶训练营 笔记,访问 博客: Go进阶训练营, 即可查看当前更新进度,部分文章篇幅较长,使用 PC 大屏浏览体验更佳。
在上一篇文章 《Week03: Go 并发编程(六) 深入理解 WaitGroup》当中我们从源码层面深入的了解了 WaitGroup 相关的使用与实现。
虽然 WaitGroup 已经帮我们做了很好的封装,但是仍然存在一些问题,例如如果需要返回错误,或者只要一个 goroutine 出错我们就不再等其他 goroutine 了,减少资源浪费,这些 WaitGroup 都不能很好的解决,这时候就派出本文的选手 errgroup 出场了。
1 | |
整个包就一个 Group 结构体
WithContext 可以创建一个带取消的 GroupGo 方法传入一个 func() error 内部会启动一个 goroutine 去处理Wait 类似 WaitGroup 的 Wait 方法,等待所有的 goroutine 结束后退出,返回的错误是一个出错的 err1 | |
1 | |
WithContext 就是使用 WithCancel 创建一个可以取消的 context 将 cancel 赋值给 Group 保存起来,然后再将 context 返回回去
注意这里有一个坑,在后面的代码中不要把这个 ctx 当做父 context 又传给下游,因为 errgroup 取消了,这个 context 就没用了,会导致下游复用的时候出错
1 | |
Go 方法其实就类似于 go 关键字,会启动一个携程,然后利用 waitgroup 来控制是否结束,如果有一个非 nil 的 error 出现就会保存起来并且如果有 cancel 就会调用 cancel 取消掉,使 ctx 返回
1 | |
Wait 方法其实就是调用 WaitGroup 等待,如果有 cancel 就调用一下
这个其实是 week03 的作业
基于 errgroup 实现一个 http server 的启动和关闭 ,以及 linux signal 信号的注册和处理,要保证能够 一个退出,全部注销退出。
1 | |
这里主要用到了 errgroup 一个出错,其余取消的能力
注:本文已发布超过一年,请注意您所使用工具的相关版本是否适用
本系列为 Go 进阶训练营 笔记,访问 博客: Go进阶训练营, 即可查看当前更新进度,部分文章篇幅较长,使用 PC 大屏浏览体验更佳。
在上一篇文章 《Week03: Go 并发编程(六) 深入理解 WaitGroup》当中我们从源码层面深入的了解了 WaitGroup 相关的使用与实现。
虽然 WaitGroup 已经帮我们做了很好的封装,但是仍然存在一些问题,例如如果需要返回错误,或者只要一个 goroutine 出错我们就不再等其他 goroutine 了,减少资源浪费,这些 WaitGroup 都不能很好的解决,这时候就派出本文的选手 errgroup 出场了。
1 | |
整个包就一个 Group 结构体
WithContext 可以创建一个带取消的 GroupGo 方法传入一个 func() error 内部会启动一个 goroutine 去处理Wait 类似 WaitGroup 的 Wait 方法,等待所有的 goroutine 结束后退出,返回的错误是一个出错的 err1 | |
1 | |
WithContext 就是使用 WithCancel 创建一个可以取消的 context 将 cancel 赋值给 Group 保存起来,然后再将 context 返回回去
注意这里有一个坑,在后面的代码中不要把这个 ctx 当做父 context 又传给下游,因为 errgroup 取消了,这个 context 就没用了,会导致下游复用的时候出错
1 | |
Go 方法其实就类似于 go 关键字,会启动一个携程,然后利用 waitgroup 来控制是否结束,如果有一个非 nil 的 error 出现就会保存起来并且如果有 cancel 就会调用 cancel 取消掉,使 ctx 返回
1 | |
Wait 方法其实就是调用 WaitGroup 等待,如果有 cancel 就调用一下
这个其实是 week03 的作业
基于 errgroup 实现一个 http server 的启动和关闭 ,以及 linux signal 信号的注册和处理,要保证能够 一个退出,全部注销退出。
1 | |
这里主要用到了 errgroup 一个出错,其余取消的能力