教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang--监控goroutine异常退出

golang--监控goroutine异常退出

发布时间:2023-01-04   编辑:jiaochengji.com
教程集为您提供golang--监控goroutine异常退出等资源,欢迎您收藏本站,我们将为您提供最新的golang--监控goroutine异常退出资源

在golang中,我们可以很轻易产生数以万计的goroutine,不过这也带来了麻烦:在运行中某一个goroutine异常退出,怎么办?

在erlang中,有link原语,2个进程可以链接在一起,一个在异常退出的时候,向另一个进程呼喊崩溃的原因,然后由另一个进程处理这些信号,包括是否重启这个进程。在这方面,erlang的确做得很好,估计以后这个特性会在golang中得到实现。

由此得到启发,我写了一个简单的程序,监控goroutine异常退出。

package main

import (
    "log"
    "runtime"
    "math/rand"
    "time"
)

type message struct {
    normal bool //true means exit normal, otherwise
    state 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个退出信号。由图可以得到我们的程序运行良好。

转贴请注明来自:格通


到此这篇关于“golang--监控goroutine异常退出”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang--监控goroutine异常退出
goroutine 调度器
Golang并发编程中控制主goroutine退出实现的例子
golang 理解 Context包 及 为何要使用 Context包
golang goroutine 通知_深入golang之---goroutine并发控制与通信
理解 goroutine 的并发
浅谈goroutine
以goroutine为例看协程的相关概念
从零学习 Go 语言(24):理解 Go 语言中的 goroutine
goroutine泄露:原理、场景、检测和防范

[关闭]
~ ~