Go语言实战笔记(一)

[!阅读]
最近在看飞雪大佬的书,顺便学习一下go语言中一些细节部分和膜一下大佬的代码,学学如何写代码一边还要准备写数学,累,争取每天能多学一点吧~

Context: 多协程并发控制神器

控制并发有两种经典的方式,一种是WaitGroup,另外一种就是Context,今天我就谈谈Context。

wg来控制协程是方便,有多少个协程你wg.Add几个即可,然后依次wg.Done即可.
但有好处也有弊端,这是一种控制并发的方式,这种尤其适用于,好多个goroutine协同做一件事情的时候,因为每个goroutine做的都是这件事情的一部分,只有全部的goroutine都完成,这件事情才算是完成,这是等待的方式.弊端就是: 无法精细化控制携程,只能苦苦等待.

在实际的业务中,我们可能会有这么一种场景:需要我们主动的通知某一个goroutine结束。比如我们开启一个后台goroutine一直做事情,比如监控,现在不需要了,就需要通知这个监控goroutine结束,不然它会一直跑,就泄漏了,浪费了资源。一种优雅退出方式就是for-select chan + select方式,用一个chan去通知,但是不适合多个groutine的管理,无法应对复杂的关系链.
demo:

fold
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func main() {
stop := make(chan bool)

go func() {
for {
select {
case <-stop:
fmt.Println("监控退出,停止了...")
return
default:
fmt.Println("goroutine监控中...")
time.Sleep(2 * time.Second)
}
}
}()

time.Sleep(10 * time.Second)
fmt.Println("可以了,通知监控停止")
stop<- true
//为了检测监控过是否停止,如果没有监控输出,就表示停止了
time.Sleep(5 * time.Second)
}

后者在任意地方添加一个即可表明退出信号的发布
stop<-true