zoukankan      html  css  js  c++  java
  • go语言里多线程使用recover捕获panic错误(防止一个子线程出错导致整个进程结束)

    我们启动多线程时,可能某一个子线程的操作会出现不重要的panic错误(只需要打印日志即可,不用结束整个进程),这时我们就可以用recover来捕获panic错误,来进行处理,下面是具体实例:

     
    package main
    
    import (
        "fmt"
        "time"
        "runtime"
    )
    
    // 定义test函数
    func test() {
        // 使用defer定义错误处理函数,recover捕获panic错误并处理,防止因为一个子线程出错导致主线程退出影响其他子线程工作
        defer func() {
            if err := recover(); err != nil {
                fmt.Println("panic:",err)
            }
        }()
    
        var m map[string]int        // 定义map,没有初始化
        m["stu"] = 100            // 没有初始化map,执行赋值操作时会报错(panic)
    }
    
    // 定义calc函数
    func calc() {
        for {
            fmt.Println("i'm calc")
            time.Sleep(time.Second)
        }
    }
    
    func main() {
        num := runtime.NumCPU()      // 获取cpu数量
        runtime.GOMAXPROCS(num - 1)   // 绑定总cpu数-1的cpu上执行
        go test()      // 启动线程执行test函数
        for i :=0; i < 5; i ++ {
            go calc()      // 启动两个线程执行calc函数
        }
        time.Sleep(time.Second*2)
    }
    
    /*
    执行结果为:
    i'm calc
    i'm calc
    i'm calc
    i'm calc
    i'm calc
    panic: assignment to entry in nil map          // 没有因为这个panic影响其他线程
    i'm calc
    i'm calc
    i'm calc
    i'm calc
    i'm calc
    */
  • 相关阅读:
    Linux系统_Linux平台“盖茨木马”初步了解
    查杀病毒的NB命令
    rabbitmq 常用的一些命令
    date 修改系统时间
    mkpasswd
    关于haproxy负载均衡的算法整理
    MySQL数据表中内容大小写区分的设置
    查看某个端口的连接数
    rabbitmq
    mysqldump 报导常
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/14804057.html
Copyright © 2011-2022 走看看