那么,我们如何做到一个Goroutine已经死亡了呢?

    子Goroutine

    可以通过给一个被监控的Goroutine添加一个 ,然后recover() 捕获到当前Goroutine的异常状态,最后给主Goroutine发送一个死亡信号,通过Channel

    主Goroutine

    主Goroutine上,从这个读取内容,当读到内容时,就重启这个子Goroutine,当然主Goroutine需要记录子Goroutine的,这样也就可以针对性的启动了。

    二、代码实现

    WorkerManager作为主Goroutine, worker作为子

    func (wk worker) work(workerChan chan<- worker) (err error) { // 任何Goroutine只要异常退出或者正常退出 都会调用defer 函数,所以在defer中想WorkerManager的WorkChan发送通知 defer func() { //捕获异常信息,防止panic直接退出 if r := recover(); r != nil { if err, ok := r.(error); ok { wk.err = err } else { wk.err = fmt.Errorf(“Panic happened with [%v]”, r) } } else { wk.err = err }

    // do something fmt.Println(“Start Worker…ID = “, wk.id)

    // 每个worker睡眠一定时间之后,panic退出或者 Goexit()退出 for i := 0; i < 5; i++ { time.Sleep(time.Second*1) }

    panic(“worker panic..”) //runtime.Goexit()

    return err }

    我们会发现,无论子Goroutine是因为 panic()异常退出,还是Goexit()退出,都会被主Goroutine监听到并且重启。主要我们就能够起到保活的功能了. 当然如果线程死亡?进程死亡?我们如何保证? 大家不用担心,我们用Go开发实际上是基于Go的调度器来开发的,进程、线程级别的死亡,会导致调度器死亡,那么我们的全部基础框架都将会塌陷。那么就要看线程、进程如何保活啦,不在我们Go开发的范畴之内了。