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
Libérer: 2024-11-23 01:39:37
original
894 Les gens l'ont consulté

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()
}
Copier après la connexion

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")
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal