依赖于轮询器始终运行的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。

作为最佳实践,为了确保// code here也不会这样做,请将其"包装"在一个函数(匿名或命名函数)中,并在其中使用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...
        }()
    }
}

最新更新