协程报错闪退

协程如果不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协程异常相关推荐

  1. golang异步协程调度原理

    golang异步协程调度 在1.14的go版本中,官方通过加入信号来进行协程的调度,后续就都支持了这种异步协程抢占,避免了早起的考栈调度时来检查是否执行超时的逻辑.本文简单来对比这种实现的原理. 调度 ...

  2. k8s与监控--从telegraf改造谈golang多协程精确控制

    从telegraf改造谈golang多协程精确控制 前言 telegraf是infuxdb公司开源出来的一个基于插件机制的收集metrics的 项目.整个架构和elastic公司的日志收集系统极其类似 ...

  3. Golang的协程调度

    调度的基础,模型关系的映射 GPM模型: G,Goroutinue 被调度器管理的轻量级线程,goroutine使用go关键字创建 调度系统的最基本单位goroutine,存储了goroutine的执 ...

  4. Golang的协程调度器原理及GMP设计思想

    一.Golang"调度器"的由来? (1) 单进程时代不需要调度器 我们知道,一切的软件都是跑在操作系统上,真正用来干活(计算)的是CPU.早期的操作系统每个程序就是一个进程,知道 ...

  5. golang goroutine 协程原理

    一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...

  6. Golang的协程(goroutine)和同步机制

    1.协程介绍         进程和线程都是由操作系统内核进行调度,有 CPU 时间片的概念,进行抢占式调度.         协程是用户级的线程,对内核是透明的,系统并不知道协程的存在,并且协程是非 ...

  7. golang 多协程的同步方法总结

    之前用 go 写一个小工具的时候, 用到了多个协程之间的通信, 当时随手查了查, 结果查出来一大坨, 简单记录一下. golang中多个协程之间是如何进行通信及数据同步的嘞. 共享变量 一个最简单, ...

  8. golang goroutine协程运行机制及使用详解

    Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言.Go于2009年正式推出,国内各大互联网公司都有使用,尤其是七牛云,基本都是golang写的, ...

  9. golang 单协程和多协程的性能测试

    测试数据:单协程操作1亿数据,以及多协程(10条协程)操作1亿数据(每条协程操作1kw数据) 废话少说,贴代码: 单协程测试运算: package mainimport ("fmt" ...

  10. Golang的协程池设计

    转载地址:https://studygolang.com/articles/15477 使用Go语言实现并发的协程调度池阉割版,本文主要介绍协程池的基本设计思路,目的为深入浅出快速了解协程池工作原理, ...

最新文章

  1. 讨论JDK的File.equal()
  2. React学习笔记5:React Hooks概述
  3. FANUC常用CNC诊断数据表
  4. leetcode 11. Container With Most Water
  5. 【android】og
  6. 30秒的PHP代码片段-MATH
  7. 二维数组排序 行与列分别升序_6个经典排序技巧,尤其是最后一个,绝对的个性化...
  8. 中国大数据与智能计算产业联盟“开源软件工作委员会”成立会议在京召开
  9. pyexiv2修改图片exvif
  10. 怎样给计算机做屏幕保护,电脑屏保软件如何制作屏保 及如何设置屏幕保护
  11. mzy git学习,分支冲突,以及冲突解决(五)
  12. MATLAB对水下目标去噪声代码,水下目标噪声与背景噪声的建模与仿真
  13. 短信聊天软件需求征集
  14. google 招聘题
  15. 编程语言排名到底是哪来的?
  16. Unix/Linux中的read和write函数
  17. H5 App调试工具vconsole
  18. 设计模式 工厂模式 从卖肉夹馍说起
  19. 麻省理工数学与计算机科学,哈佛和麻省理工学院数学专业哪个更好一点?
  20. 2022-5-4-找出游戏的获胜者

热门文章

  1. yum更换国内源、yum下载rpm包  源码包安装
  2. 简单复制粘贴个linux红帽6
  3. 用存储过程DataFactory准备测试数据
  4. nginx基于htpasswd安全验证
  5. 2.SRE:Google运维解密 --- Google 生产环境:SRE 视角
  6. 3. LAMP 安装与配置
  7. 6. 隐藏 index.php
  8. 汇编语言将十六进制数转换成十进制数_汇编语言--键盘输入两个一位十进制数 ,以十进制数的形式输出其和...
  9. Windows系统命令整理-Win10
  10. 微信小游戏flappy bird填坑