当前位置: > > > > 依赖轮询器始终运行的 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知识!