Go приложение, которое всегда использует запущенный механизм опроса, советы по обеспечению его стабильности - PullRequest
0 голосов
/ 03 января 2019

Таким образом, мое приложение использует goroutine, который опрашивает каждые x секунд.

func main() {
   // ...
   go p.StartPoller();
}

Какие советы помогут убедиться, что этот опросор всегда работает?

Мне просто надоели вещи, может быть, потому что я не совсем понимаю концепцию перехвата ошибок в go,Так как ошибки являются значениями, и если я не использую ни одну из библиотек, я использую вызов panic (), и нет ссылок на нулевой указатель или массива вне границ любой код внутри этой программы не должен вызывать корректную ошибку программы ?

func (p *Poller) StartPoller() {
        ticker := time.NewTicker(3 * time.Second)
        defer ticker.Stop() 

        for {
            <-ticker.C
            // code here
        }

    }

1 Ответ

0 голосов
/ 03 января 2019

Вы правы, код, который вы разместили, никогда не должен паниковать и, следовательно, "сбивать" программу.

В качестве лучшей практики, чтобы гарантировать, что // 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...
        }()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...