Maison >développement back-end >Golang >Comment la fonction « recover() » de Go peut-elle assurer la persistance de Goroutine face aux crashs ?

Comment la fonction « recover() » de Go peut-elle assurer la persistance de Goroutine face aux crashs ?

DDD
DDDoriginal
2024-11-23 01:39:37885parcourir

How Can Go's `recover()` Function Ensure Goroutine Persistence in the Face of Crashes?

Assurer la persistance de Goroutine malgré les crashs

Dans les programmes Go simultanés, plusieurs goroutines s'exécutent souvent simultanément, chacune effectuant des tâches distinctes. Cependant, il est crucial de résoudre le problème de la gestion des échecs des goroutines, en garantissant que les autres goroutines continuent de s'exécuter même si l'une d'elles plante.

Considérons un programme avec deux goroutines : queue.ConsumeAndDoSomething() consomme une file d'attente et api.StartServer () exécute une API. Idéalement, si queue.ConsumeAndDoSomething() échoue, le serveur API ne devrait pas être affecté et vice versa.

Une approche pour atteindre cette persistance consiste à utiliser la fonction recovery() intégrée et les fonctions différées. La fonction recovery() peut détecter les paniques et exécuter une routine de nettoyage, tandis que les fonctions différées s'exécutent automatiquement à la fin de la fonction environnante.

Voici comment utiliser recovery() et les fonctions différées pour se protéger contre les plantages de goroutine :

func protect(f func()) {
    defer func() {
        if err := recover(); err != nil {
            log.Printf("Recovered: %v", err)
        }
    }()

    f()
}

Cette fonction d'assistance, protector(), enveloppe la fonction fournie (f) dans une fonction différée qui gère toutes les paniques. La fonction différée s'exécute avant le retour de f, qu'une panique se produise ou non.

Pour utiliser protector(), passez simplement la fonction goroutine en argument :

func main() {
    go protect(queue.ConsumeAndDoSomething)
    go protect(api.StartServer)

    for {
        time.Sleep(time.Second)
        fmt.Println("tick")
    }
}

Avec ce mécanisme en place, si queue.ConsumeAndDoSomething() ou api.StartServer() subit une panique, elle sera interceptée par la fonction différée et nettoyée sans faire planter le programme. L'autre goroutine continuera à fonctionner comme prévu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn