[!阅读]
最近在看飞雪大佬的书,顺便学习一下go语言中一些细节部分和膜一下大佬的代码,学学如何写代码一边还要准备写数学,累,争取每天能多学一点吧~
Context: 多协程并发控制神器
控制并发有两种经典的方式,一种是WaitGroup,另外一种就是Context,今天我就谈谈Context。
wg来控制协程是方便,有多少个协程你wg.Add几个即可,然后依次wg.Done即可.
但有好处也有弊端,这是一种控制并发的方式,这种尤其适用于,好多个goroutine协同做一件事情的时候,因为每个goroutine做的都是这件事情的一部分,只有全部的goroutine都完成,这件事情才算是完成,这是等待的方式.弊端就是: 无法精细化控制携程,只能苦苦等待.
在实际的业务中,我们可能会有这么一种场景:需要我们主动的通知某一个goroutine结束。比如我们开启一个后台goroutine一直做事情,比如监控,现在不需要了,就需要通知这个监控goroutine结束,不然它会一直跑,就泄漏了,浪费了资源。一种优雅退出方式就是for-select chan + select方式,用一个chan去通知,但是不适合多个groutine的管理,无法应对复杂的关系链.
demo:
1 | func main() { |