17 协程
1. WaitGroup
创建waitgroup
后,一般会指定其add
的数目。使用defer wg.Done()
的方式使其减一。使用wait
等待子协程执行完成。
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
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 fmt.Println("f1 finish") }
func main() { go f1() time.Sleep(1 * time.Second) fmt.Println("main finish") }
|