go语言里多线程使用recover捕获panic错误(防止一个子线程出错导致整个进程结束)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
*/。