登录
首页 >  Golang >  Go问答

依赖轮询器始终运行的 Go 应用程序,确保其稳定性的建议

来源:stackoverflow

时间:2024-04-20 22:27:36 413浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《依赖轮询器始终运行的 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学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>