当前位置: > > > > 依赖轮询器始终运行的 Go 应用程序,确保其稳定性的建议
依赖轮询器始终运行的 Go 应用程序,确保其稳定性的建议
来源:stackoverflow
2024-04-20 22:27:36
0浏览
收藏
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《依赖轮询器始终运行的 Go 应用程序,确保其稳定性的建议》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。
问题内容
所以我的应用程序依赖于每 x 秒轮询一次的 goroutine。
func main() {
// ...
go p.startpoller();
}
有哪些技巧可以确保此轮询器始终运行?
我只是对事情感到厌倦,也许是因为我不完全理解 go 中错误捕获的概念。由于错误是值,假设我或我使用的任何库都没有调用panic(),并且没有空指针引用或数组越界此 goroutine 内的任何代码都不应该使 goroutine 崩溃,正确强>?
func (p *Poller) StartPoller() {
ticker := time.NewTicker(3 * time.Second)
defer ticker.Stop()
for {
<-ticker.C
// code here
}
}
解决方案
你是对的,你发布的代码不应该出现恐慌,从而使 goroutine “崩溃”。
作为一种最佳实践,为了确保这里的 // 代码 也不会这样做,请将其“包装”在一个函数(匿名或命名函数)中,并在其中使用 recover() (延迟!)。这将确保轮询任务也不会“崩溃”轮询调度程序。
类似这样的事情:
func (p *poller) startpoller() {
ticker := time.newticker(3 * time.second)
defer ticker.stop()
for {
<-ticker.c
func() {
defer func() {
if r := recover(); r != nil {
fmt.println("recovered: %v", r)
}
}()
// code here
// if this would panic, it will be recovered...
}()
}
}
即使轮询器始终运行,我仍然会为其添加一个“关闭”通道,从而提供优雅终止的可能性:
func (p *Poller) StartPoller(shutdown <-chan struct{}) {
ticker := time.NewTicker(3 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
case <-shutdown:
return
}
func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered: %v", r)
}
}()
// code here
// If this would panic, it will be recovered...
}()
}
}
好了,本文到此结束,带大家了解了《依赖轮询器始终运行的 Go 应用程序,确保其稳定性的建议》,希望本文对你有所帮助!关注米云公众号,给大家分享更多Golang知识!
