• 防止goroutine崩溃同时也导致主进程崩溃


    举个例子 比如这种情况 主进程会直接崩溃 看不到这个ok的打印

    package main
    
    import (
        "log"
        "time"
    )
    
    func Panic()  {
        panic(1)
    }
    
    func main()  {
        go Panic()
        time.Sleep(1 * time.Second)
        log.Println("OK")
    }
    

    这时使用这个函数

    在panic之后主进程就不会崩溃了

    可以看到这个ok打印出来

    func NewRoutine(f func()) {
    	go func() {
    		defer func() {
    			// Recover from panic.
    			if err := recover(); err != nil {
    				stack := string(debug.Stack())
    				log.Println(err)
    				log.Println(stack)
    			}
    		}()
    
    		f()
    	}()
    }
    func Panic()  {
        panic(1)
    }
    func main()  {
        NewRoutine(Panic)
    
        time.Sleep(1 * time.Second)
        log.Println("OK")
    }
    

      

    因为这个函数里使用了recover 可以使panic的函数不会立刻返回 而是先defer 再返回

    这样就避免了主进程崩溃的情况

  • 相关阅读:
    ZeroMQ自查手册
    如何回答——请简述MySQL索引类型
    101. 对称二叉树
    66. 加一
    104. 二叉树的最大深度
    724.寻找数组的中心索引
    33. 搜索旋转排序数组
    快速排序
    Vue
    HTML
  • 原文地址:https://www.cnblogs.com/general10/p/12033455.html
Copyright © 2020-2023  润新知