请问如何实现,一个gorouting出错,让所有的gorouting同时退出

码强
  • 26

同时启动多个gorouting,一旦一个gorouting出错,让所有的gorouting同时退出,请问如何实现?

回复
阅读 2.4k
3 个回答
✓ 已被采纳

三种方式吧:
1、如果你的程序没有捕获 panic,那么只要有一个 goroutine 出现了 panic 整个进程都会退出。
2、在 goroutine 的 defer 方法中来捕获当前协程的 panic ,如果捕获成功,调用 os.Exit(1) 来退出。
3、启动协程时传递一个context,同时在defer 中使用 recover 捕获 panic ,如果成功,直接调用 cancel方法通知所有协程退出,这种方法不会使进程崩溃。

启动goroutine时使用defer+recover,如果不想恢复,直接调用os.Exit就退出了

func main(){
    for i := 0 ; i < 100 ; i ++ {
        go func(j int){
            if j == 99 {
                panic('exit all go routines')
            }
        }(i)
    }
    
    time.Sleep(1*time.Second)
}

只要 goroutine 内有panic,并且这个panic没有被recover捕获,程序会直接崩溃退出。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏