17 协程

17 协程

1. WaitGroup

​ 创建waitgroup后,一般会指定其add的数目。使用defer wg.Done()的方式使其减一。使用wait等待子协程执行完成。

// Package main -----------------------------
// @file : waitgroup.go
// @author : Yunyin
// @contact : yunyin_jayyi@qq.com
// @time : 2023/7/30 14:40
// -------------------------------------------
package main

import (
"fmt"
"sync"
)

func main() {
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
fmt.Println("f1 finish")
}()
go func() {
defer wg.Done()
fmt.Println("f2 finish")
}()

wg.Wait()
}

2. 风险隔离

​ 即使通过gorutine的方式调用了协程,但是一旦协程中出现了panic,整个进程都会挂掉。

​ 解决方案:通过在协程开头使用recover函数,并用defer形成闭包。通过这种方式将风险隔离在子协程中。

// Package main -----------------------------
// @file : recover.go
// @author : Yunyin
// @contact : yunyin_jayyi@qq.com
// @time : 2023/7/30 14:47
// -------------------------------------------
package main

import (
"fmt"
"time"
)

func f1() {
defer func() {
err := recover() //隔离风险,同时也要暴露问题
if err != nil {
fmt.Println("发生了panic", err)
}
}()
a, b := 3, 0
fmt.Println(a, b)
_ = a / b //此处发生panic
fmt.Println("f1 finish")
}

func main() {
go f1()
time.Sleep(1 * time.Second)
fmt.Println("main finish")
}