golang cover协程异常
协程报错闪退
协程如果不cover异常会出现闪退问题,但是在大批量创建各种协程每次都需要cover会非常难处理,golang 异常处理我不是很熟悉,简单写了一个,不知道是否靠谱
common
package loggerimport ("fmt""reflect""runtime""strings"
)//创建安全的协程
func CreateSafeGo(call func(), errCall func(err interface{})) {go func() {defer SafeGoRecover(errCall)call()}()
}func SafeGoRecover(errCall func(err interface{})) {if err := recover(); err != nil {Error("recover error: %v", err)if errCall != nil {errCall(err)}}
}func getCaller() string {src := "No Caller"_, file, lineno, ok := runtime.Caller(2)var strim = "src/"//fix # 不是每个前面都有src的,所以可以获取当前if ok {src = strings.Replace(fmt.Sprintf("%s:%d", stringTrim(file, strim), lineno), "%2e", ".", -1)}return src
}//TODO Params
//反射实现参数恢复
func SafeGoWithParams(call interface{}, errCall func(err interface{}), params ...interface{}) {go func() {defer SafeGoRecover(errCall)funcValue := reflect.ValueOf(call)var paramsList []reflect.Valuefor _, v := range params {paramsList = append(paramsList, reflect.ValueOf(v))}funcValue.Call(paramsList)}()
}
test
package loggerimport ("fmt""testing""time"
)func TestCreateSafeGo(t *testing.T) {CreateSafeGo(func() {panic("1231")}, func(err interface{}) {Error("asdasd")})time.Sleep(time.Second)
}func TestSafeGoRecover(t *testing.T) {go func() {defer SafeGoRecover(func(err interface{}) {Error("asdasd")})panic("1231")}()time.Sleep(time.Second)
}func TestCreateSafeGoWithParams(t *testing.T) {SafeGoWithParams(func(aa int) {fmt.Println(aa)}, func(err interface{}) {}, 123)time.Sleep(time.Second)
}
golang cover协程异常相关推荐
- golang异步协程调度原理
golang异步协程调度 在1.14的go版本中,官方通过加入信号来进行协程的调度,后续就都支持了这种异步协程抢占,避免了早起的考栈调度时来检查是否执行超时的逻辑.本文简单来对比这种实现的原理. 调度 ...
- k8s与监控--从telegraf改造谈golang多协程精确控制
从telegraf改造谈golang多协程精确控制 前言 telegraf是infuxdb公司开源出来的一个基于插件机制的收集metrics的 项目.整个架构和elastic公司的日志收集系统极其类似 ...
- Golang的协程调度
调度的基础,模型关系的映射 GPM模型: G,Goroutinue 被调度器管理的轻量级线程,goroutine使用go关键字创建 调度系统的最基本单位goroutine,存储了goroutine的执 ...
- Golang的协程调度器原理及GMP设计思想
一.Golang"调度器"的由来? (1) 单进程时代不需要调度器 我们知道,一切的软件都是跑在操作系统上,真正用来干活(计算)的是CPU.早期的操作系统每个程序就是一个进程,知道 ...
- golang goroutine 协程原理
一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...
- Golang的协程(goroutine)和同步机制
1.协程介绍 进程和线程都是由操作系统内核进行调度,有 CPU 时间片的概念,进行抢占式调度. 协程是用户级的线程,对内核是透明的,系统并不知道协程的存在,并且协程是非 ...
- golang 多协程的同步方法总结
之前用 go 写一个小工具的时候, 用到了多个协程之间的通信, 当时随手查了查, 结果查出来一大坨, 简单记录一下. golang中多个协程之间是如何进行通信及数据同步的嘞. 共享变量 一个最简单, ...
- golang goroutine协程运行机制及使用详解
Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言.Go于2009年正式推出,国内各大互联网公司都有使用,尤其是七牛云,基本都是golang写的, ...
- golang 单协程和多协程的性能测试
测试数据:单协程操作1亿数据,以及多协程(10条协程)操作1亿数据(每条协程操作1kw数据) 废话少说,贴代码: 单协程测试运算: package mainimport ("fmt" ...
- Golang的协程池设计
转载地址:https://studygolang.com/articles/15477 使用Go语言实现并发的协程调度池阉割版,本文主要介绍协程池的基本设计思路,目的为深入浅出快速了解协程池工作原理, ...
最新文章
- 讨论JDK的File.equal()
- React学习笔记5:React Hooks概述
- FANUC常用CNC诊断数据表
- leetcode 11. Container With Most Water
- 【android】og
- 30秒的PHP代码片段-MATH
- 二维数组排序 行与列分别升序_6个经典排序技巧,尤其是最后一个,绝对的个性化...
- 中国大数据与智能计算产业联盟“开源软件工作委员会”成立会议在京召开
- pyexiv2修改图片exvif
- 怎样给计算机做屏幕保护,电脑屏保软件如何制作屏保 及如何设置屏幕保护
- mzy git学习,分支冲突,以及冲突解决(五)
- MATLAB对水下目标去噪声代码,水下目标噪声与背景噪声的建模与仿真
- 短信聊天软件需求征集
- google 招聘题
- 编程语言排名到底是哪来的?
- Unix/Linux中的read和write函数
- H5 App调试工具vconsole
- 设计模式 工厂模式 从卖肉夹馍说起
- 麻省理工数学与计算机科学,哈佛和麻省理工学院数学专业哪个更好一点?
- 2022-5-4-找出游戏的获胜者
热门文章
- yum更换国内源、yum下载rpm包 源码包安装
- 简单复制粘贴个linux红帽6
- 用存储过程DataFactory准备测试数据
- nginx基于htpasswd安全验证
- 2.SRE:Google运维解密 --- Google 生产环境:SRE 视角
- 3. LAMP 安装与配置
- 6. 隐藏 index.php
- 汇编语言将十六进制数转换成十进制数_汇编语言--键盘输入两个一位十进制数 ,以十进制数的形式输出其和...
- Windows系统命令整理-Win10
- 微信小游戏flappy bird填坑