Maison >développement back-end >Golang >Comment puis-je faire fonctionner mes Go Goroutines même après une panique ?

Comment puis-je faire fonctionner mes Go Goroutines même après une panique ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 00:20:13235parcourir

How Can I Keep My Go Goroutines Running Even After a Panic?

Maintenir les goroutines en marche malgré les crashs

Dans Go, les goroutines sont puissantes mais peuvent être sensibles aux plantages dus à des erreurs ou à des paniques. Pour garantir que l'échec d'une goroutine n'affecte pas les autres, les développeurs peuvent se demander s'il existe un moyen de maintenir les goroutines non affectées en fonctionnement.

Pour se remettre d'une panique, la fonction intégrée recovery() est utilisée. Il permet d'attraper une panique au sein d'une fonction différée. La fonction d'assistance suivante, Protect(), utilise ce mécanisme pour lancer des goroutines avec récupération de panique :

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

    f()
}

Pour utiliser cette protection, transmettez simplement votre fonction comme argument à Protect(). En enveloppant cet appel dans une boucle for qui imprime continuellement « tick », nous pouvons démontrer comment la goroutine protégée par Protect() continuera à fonctionner même si une panique se produit dans une autre goroutine :

func main() {
    go protect(doPanic)

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

Cette application de test affichera :

2021/03/04 14:12:31 about to panic
2021/03/04 14:12:31 Recovered: test
tick
tick
tick
...

Comme vous pouvez le voir, la panique dans la fonction doPanic est récupérée et gérée, tandis que la goroutine protégée continue de s'exécuter et d'imprimer "tick". Cette approche isole efficacement les goroutines des paniques, garantissant qu'un seul échec ne se propage pas et ne plante pas l'ensemble de l'application.

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