自动重启因为恐慌而退出的协程
Hyman 2022/3/4 转载Go
Go协程panic后能捕获异常,还可以自动重启:
package main
import "log"
import "time"
func shouldNotExit() {
for {
time.Sleep(time.Second) // 模拟一个工作负载
// 模拟一个未预料到的恐慌。
if time.Now().UnixNano() & 0x3 == 0 {
panic("unexpected situation")
}
}
}
func NeverExit(name string, f func()) {
defer func() {
if v := recover(); v != nil { // 侦测到一个恐慌
log.Printf("协程%s崩溃了,准备重启一个", name)
go NeverExit(name, f) // 重启一个同功能协程
}
}()
f()
}
func main() {
log.SetFlags(0)
go NeverExit("job#A", shouldNotExit)
go NeverExit("job#B", shouldNotExit)
select{} // 永久阻塞主线程
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
转自:https://gfw.go101.org/article/panic-and-recover-use-cases.html