是否有类似java Thread.isAlive()的goroutine 函数?
我正在尝试生成一些goroutine,这些线程本来应该是长寿的线程,但是我担心goroutine会在进程中死去,是否可以在我的主线程中执行检查以查看goroutine是否还活着?
最好的方法是不知道它是否还活着,而是知道它何时死亡,以便您可以重新启动它。
您可以通过设置做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)