如何知道goroutine是否仍然存在?

use*_*010 1 go goroutine

是否有类似java Thread.isAlive()的goroutine 函数?

我正在尝试生成一些goroutine,这些线程本来应该是长寿的线程,但是我担心goroutine会在进程中死去,是否可以在我的主线程中执行检查以查看goroutine是否还活着?

Fra*_* P. 6

最好的方法是不知道它是否还活着,而是知道它何时死亡,以便您可以重新启动它。

您可以通过设置做defer一个recover对你的goroutine这将写入信道信令的够程的死亡。然后,在主goroutine上,您从该通道读取数据,并且每当读取某些内容时,都将重新启动goroutine。您可以通过返回包含goroutine id和错误的结构来识别gogorine失败。

例:

package main

import "fmt"

// number of desired workers
const nWorkers = 10

func main() {
        // make a buffered channel with the space for my 10 workers
        workerChan := make(chan *worker, nWorkers)

        for i := 0; i < nWorkers; i++ {
                i := i
                wk := &worker{id: i}
                go wk.work(workerChan)
        }

        // read the channel, it will block until something is written, then a new
        // goroutine will start
        for wk := range workerChan {
                // log the error
                fmt.Printf("Worker %d stopped with err: %s", wk.id, wk.err)
                // reset err
                wk.err = nil
                // a goroutine has ended, restart it
                go wk.work(workerChan)
        }
}

type worker struct {
        id  int
        err error
}

func (wk *worker) work(workerChan chan<- *worker) (err error) {
        // make my goroutine signal its death, wether it's a panic or a return
        defer func() {
                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
                }
                workerChan <- wk
        }()

        // do something
        // ...

        return err
}
Run Code Online (Sandbox Code Playgroud)


Vol*_*ker 4

Goroutine 是否有类似 java Thread.isAlive() 的函数?

不,您必须重新设计您的解决方案。Goroutines 没有身份,不能以任何方式访问。