golang--监控goroutine异常退出
在golang中,我们可以很轻易产生数以万计的goroutine,不过这也带来了麻烦:在运行中某一个goroutine异常退出,怎么办?
在erlang中,有link原语,2个进程可以链接在一起,一个在异常退出的时候,向另一个进程呼喊崩溃的原因,然后由另一个进程处理这些信号,包括是否重启这个进程。在这方面,erlang的确做得很好,估计以后这个特性会在golang中得到实现。
由此得到启发,我写了一个简单的程序,监控goroutine异常退出。
package mainimport ("log""runtime""math/rand""time" )type message struct {normal bool //true means exit normal, otherwisestate map[string]interface{} //goroutine state }func main() {runtime.GOMAXPROCS(runtime.NumCPU())mess := make(chan message, 10)for i := 0; i < 100; i++ {go worker(mess)}supervisor(mess) }func worker(mess chan message) {defer func() {exit_message := message{state:make(map[string] interface{})}i := recover()if i != nil {exit_message.normal = false} else {exit_message.normal = true}mess <- exit_message}()now := time.Now()seed := now.UnixNano()rand.Seed(seed)num := rand.Int63()if num % 2 != 0 {panic("not evening")} else {runtime.Goexit()} }func supervisor(mess chan message) {for i := 0; i < 100; i++ {m := <- mess switch m.normal {case true :log.Println("exit normal, nothing serious!")case false:log.Println("exit abnormal, something went wrong")}} }
原本是想把goroutine异常退出时的状态,也就是某些变量保存到message中的state,然后在另一个goroutine里面处理这些数据,不过能力有限,暂时做不出来,以后会完善的。这里只验证goroutine在异常退出的时候,向另一个goroutine发送信号。
在worker函数里面,会判断随机数是不是偶数,不是的话会使用panic异常退出,然后使用defer向supervisor发送信号,supervisor接受到就输出结果。
下面看一下效果:
我们用了100个goroutine,也就有100个退出信号。由图可以得到我们的程序运行良好。
转贴请注明来自:格通
转载于:https://www.cnblogs.com/getong/archive/2013/03/29/2988702.html
golang--监控goroutine异常退出相关推荐
- GoLang之goroutine如何退出(11)
文章目录 GoLang之goroutine如何退出(11) GoLang之goroutine如何退出(11) 上一讲说到调度器将 main goroutine 推上舞台,为它铺好了道路,开始执行 ru ...
- Nginx问题定位之监控进程异常退出
nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧. 1. 在error.log中查看是否有signal项,如果有,看看signal是多少. 比如,这是一个异常退出的情况 ...
- MHA监控进程异常退出(MHA版本:0.56)
最近遇到一个非常诡异的问题,mha后台进程自己中断退出了.以下是报错: Mon Dec 21 20:16:07 2015 - [info] OK. Mon Dec 21 20:16:07 2015 - ...
- linux c 调试 strace 诊断 调试程序 异常退出 崩溃
目录 strace是什么? strace能做什么? strace怎么用? strace问题定位案例 1.定位进程异常退出 2.定位共享内存异常 3. 性能分析 跟踪系统调用和信号 strace是什么? ...
- go语言之行--golang核武器goroutine调度原理、channel详解
一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...
- mysql进程异常_关于MySQL-Proxy子进程异常退出BUG修复
关于 MySQL-Proxy 子进程异常退出的问题,我已经在之前的博文中提到过: 相关的错误信息如下图所示: 经查阅11号信号为SIGSEGV,表示进程执行了一个无效的内存引用或发生段错误,从而导致子 ...
- 一看就懂系列之Golang的goroutine和通道
https://blog.csdn.net/u011957758/article/details/81159481 前言 如果说php是最好的语言,那么golang就是最并发的语言. 支持golang ...
- 没有core的程序异常退出追查过程
最近朋友项目发生了一件怪事,好好的进程,没有任何痕迹地退出,没有core文件,没有syslog痕迹,也不是进程主动退出,因为逻辑中exit都有日志. 现在记录一下追查过程: 1.先排除core生成条件 ...
- python 实现异常退出
python 实现异常退出 参考文章: (1)python 实现异常退出 (2)https://www.cnblogs.com/ivyharding/p/11277999.html (3)https: ...
最新文章
- 现在使用计算机的工作原理是,计算机的工作原理是什么
- 第三十三篇、富文本 NSMutableAttributedString
- Android自定义泡泡效果 源码
- FI_ITEMS_MASS_CHANGE 批量更新 凭证文本 (凭证被锁、一些项目没更改到的解决方法)
- LOJ #516. 「LibreOJ β Round #2」DP 一般看规律
- 浪潮NF5270M3 刷uefi_新零售浪潮中,开为科技利用刷脸支付帮门店“运营”人
- 从网游策划谈《梦幻西游》的成功之道
- Asp.Net Boilerplate微服务实战(一)概述
- [Unity] ACT 战斗系统学习 7:使用 ScriptableObject 制作角色属性 2
- QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包
- oracle数据库快速查询关键字,数据库分页查询关键字
- php 如何移动文件,php怎样移动文件
- 并行运算遇到的fatal error(已解决)
- 浅析eTS的起源和演进
- 初中数学抽象教学的案例_初中数学教学案例分析-初中数学教学案例分析100例...
- java 爬虫 微博_最新新浪微博爬虫程序Java版 2015
- python windows下载哪个_初识Python(windows)——下载、安装、使用
- 三种语句可以恢复Oracle数据库误删除数据
- 电路板参数有哪些参数
- 中国制冷剂市场供需调研与投资竞争力分析报告2022-2028年
热门文章
- 初中计算机应用教什么,信息技术在初中数学教学中的应用
- 揭阳电网要求计算机二级吗,2018年3月广东省揭阳市计算机等级考试考务通知
- 教师招聘要求计算机证,长沙市直教师招聘考试没有计算机证能考么?
- java client类_Jmeter中自定义JavaSamplerClient类的编写
- mysql more_mysql中哪种日志不能直接cat或more
- matlab如何截取图像的中间部分_利用matlab提取并分割RGB图像中的某一个已知像素值的图像...
- C++知识点58——类模板(3、类模板的成员模板)
- (原創) 將map輸出到cout,是否有更方便的方法? (C/C++) (STL)
- SuperSocket 服务管理器 (ServerManager)
- 人类又双叒叕输了,就没人能管管这条“狗”吗?