gpt4 book ai didi

Golang,重新启动 panic 例程的正确方法

转载 作者:IT王子 更新时间:2023-10-29 01:12:50 25 4
gpt4 key购买 nike

我有以下示例代码。我想保持 4 个 goroutines 一直运行。他们有 panic 的可能。在出现 panic 的情况下,我可以在重新启动 goroutine 的地方恢复。

我实现的方式有效,但我不确定它是否是正确和正确的方式来做到这一点。任何想法

package main

import (
"fmt"
"time"
)

var gVar string
var pCount int

func pinger(c chan int) {
for i := 0; ; i++ {
fmt.Println("adding ", i)
c <- i
}
}

func printer(id int, c chan int) {
defer func() {
if err := recover(); err != nil {
fmt.Println("HERE", id)
fmt.Println(err)
pCount++
if pCount == 5 {
panic("TOO MANY PANICS")
} else {
go printer(id, c)
}
}
}()

for {
msg := <-c
fmt.Println(id, "- ping", msg, gVar)
if msg%5 == 0 {
panic("PANIC")
}

time.Sleep(time.Second * 1)

}
}

func main() {
var c chan int = make(chan int, 2)
gVar = "Preflight"
pCount = 0

go pinger(c)
go printer(1, c)
go printer(2, c)
go printer(3, c)
go printer(4, c)

var input string
fmt.Scanln(&input)
}

最佳答案

您可以在函数中提取恢复逻辑,例如:

func recoverer(maxPanics, id int, f func()) {
defer func() {
if err := recover(); err != nil {
fmt.Println("HERE", id)
fmt.Println(err)
if maxPanics == 0 {
panic("TOO MANY PANICS")
} else {
go recoverer(maxPanics-1, id, f)
}
}
}()
f()
}

然后像这样使用它:

go recoverer(5, 1, func() { printer(1, c) })

关于Golang,重新启动 panic 例程的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41603273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com