在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异常退出相关推荐

  1. GoLang之goroutine如何退出(11)

    文章目录 GoLang之goroutine如何退出(11) GoLang之goroutine如何退出(11) 上一讲说到调度器将 main goroutine 推上舞台,为它铺好了道路,开始执行 ru ...

  2. Nginx问题定位之监控进程异常退出

    nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧. 1. 在error.log中查看是否有signal项,如果有,看看signal是多少. 比如,这是一个异常退出的情况 ...

  3. MHA监控进程异常退出(MHA版本:0.56)

    最近遇到一个非常诡异的问题,mha后台进程自己中断退出了.以下是报错: Mon Dec 21 20:16:07 2015 - [info] OK. Mon Dec 21 20:16:07 2015 - ...

  4. linux c 调试 strace 诊断 调试程序 异常退出 崩溃

    目录 strace是什么? strace能做什么? strace怎么用? strace问题定位案例 1.定位进程异常退出 2.定位共享内存异常 3. 性能分析 跟踪系统调用和信号 strace是什么? ...

  5. go语言之行--golang核武器goroutine调度原理、channel详解

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

  6. mysql进程异常_关于MySQL-Proxy子进程异常退出BUG修复

    关于 MySQL-Proxy 子进程异常退出的问题,我已经在之前的博文中提到过: 相关的错误信息如下图所示: 经查阅11号信号为SIGSEGV,表示进程执行了一个无效的内存引用或发生段错误,从而导致子 ...

  7. 一看就懂系列之Golang的goroutine和通道

    https://blog.csdn.net/u011957758/article/details/81159481 前言 如果说php是最好的语言,那么golang就是最并发的语言. 支持golang ...

  8. 没有core的程序异常退出追查过程

    最近朋友项目发生了一件怪事,好好的进程,没有任何痕迹地退出,没有core文件,没有syslog痕迹,也不是进程主动退出,因为逻辑中exit都有日志. 现在记录一下追查过程: 1.先排除core生成条件 ...

  9. python 实现异常退出

    python 实现异常退出 参考文章: (1)python 实现异常退出 (2)https://www.cnblogs.com/ivyharding/p/11277999.html (3)https: ...

最新文章

  1. 现在使用计算机的工作原理是,计算机的工作原理是什么
  2. 第三十三篇、富文本 NSMutableAttributedString
  3. Android自定义泡泡效果 源码
  4. FI_ITEMS_MASS_CHANGE 批量更新 凭证文本 (凭证被锁、一些项目没更改到的解决方法)
  5. LOJ #516. 「LibreOJ β Round #2」DP 一般看规律
  6. 浪潮NF5270M3 刷uefi_新零售浪潮中,开为科技利用刷脸支付帮门店“运营”人
  7. 从网游策划谈《梦幻西游》的成功之道
  8. Asp.Net Boilerplate微服务实战(一)概述
  9. [Unity] ACT 战斗系统学习 7:使用 ScriptableObject 制作角色属性 2
  10. QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包
  11. oracle数据库快速查询关键字,数据库分页查询关键字
  12. php 如何移动文件,php怎样移动文件
  13. 并行运算遇到的fatal error(已解决)
  14. 浅析eTS的起源和演进
  15. 初中数学抽象教学的案例_初中数学教学案例分析-初中数学教学案例分析100例...
  16. java 爬虫 微博_最新新浪微博爬虫程序Java版 2015
  17. python windows下载哪个_初识Python(windows)——下载、安装、使用
  18. 三种语句可以恢复Oracle数据库误删除数据
  19. 电路板参数有哪些参数
  20. 中国制冷剂市场供需调研与投资竞争力分析报告2022-2028年

热门文章

  1. 初中计算机应用教什么,信息技术在初中数学教学中的应用
  2. 揭阳电网要求计算机二级吗,2018年3月广东省揭阳市计算机等级考试考务通知
  3. 教师招聘要求计算机证,长沙市直教师招聘考试没有计算机证能考么?
  4. java client类_Jmeter中自定义JavaSamplerClient类的编写
  5. mysql more_mysql中哪种日志不能直接cat或more
  6. matlab如何截取图像的中间部分_利用matlab提取并分割RGB图像中的某一个已知像素值的图像...
  7. C++知识点58——类模板(3、类模板的成员模板)
  8. (原創) 將map輸出到cout,是否有更方便的方法? (C/C++) (STL)
  9. SuperSocket 服务管理器 (ServerManager)
  10. 人类又双叒叕输了,就没人能管管这条“狗”吗?