详解详解Go多协程并发环境下的错误处理多协程并发环境下的错误处理
引言引言
在Go语言中,我们通常会用到panic和recover来抛出错误和捕获错误,这一对操作在单协程环境下我们正常用就好了,并不会
踩到什么坑。但是在多协程并发环境下,我们常常会碰到以下两个问题。假设我们现在有2个协程,我们叫它们协程A和B好
了:
如果协程A发生了panic,协程B是否会因为协程A的panic而挂掉?
如果协程A发生了panic,协程B是否能用recover捕获到协程A的panic?
答案分别是:会、不能。
那么下面我们来一一验证,并给出在具体的业务场景下的最佳实践。
问题一问题一
如果协程A发生了panic,协程B是否会因为协程A的panic而挂掉?
为了验证这个问题,我们写一段程序:
package main
import (
"fmt"
"time"
)
func main() {
// 协程A
go func() {
for {
fmt.Println("goroutine1_print")
}
}()
// 协程B
go func() {
time.Sleep(1 * time.Second)
panic("goroutine2_panic")
}()
time.Sleep(2 * time.Second)
}
首先主协程开启两个子协程A和B,A协程不停的循环打印goroutine1_print字符串;B协程在睡眠1s后,就会抛出panic(睡眠
这一步为了确保在A跑起来开始打印了之后,B才会panic),主协程睡眠2s,等待A、B子协程全部执行完毕,主协程退出。
最终打印结果如下:
…
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
goroutine1_print
panic: goroutine2_panicgoroutine1_print
goroutine1_print
goroutine goroutine1_print
19goroutine1_print
goroutine1_print
goroutine1_print