Maison >développement back-end >Golang >Comment puis-je empêcher une seule panique Goroutine de faire planter l'intégralité de mon programme Go ?

Comment puis-je empêcher une seule panique Goroutine de faire planter l'intégralité de mon programme Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-26 09:58:09424parcourir

How Can I Prevent a Single Goroutine Panic from Crashing My Entire Go Program?

Gérer les paniques dans les Goroutines pour garantir une exécution continue

Dans Go, les goroutines fournissent un mécanisme de concurrence léger. Cependant, lorsqu'une goroutine plante ou panique, le comportement par défaut est que l'ensemble du programme se ferme. Cela peut être problématique si vous souhaitez maintenir l'exécution d'autres goroutines qui ne sont pas liées à la goroutine en panne.

Pour résoudre ce problème, nous pouvons exploiter la fonction intégrée recovery() en conjonction avec des fonctions différées. La fonction recovery() nous permet de récupérer des paniques et de reprendre le contrôle du programme au sein de la goroutine où la panique s'est produite. Voici comment nous pouvons y parvenir :

  1. Identifier la fonction Goroutine : Identifiez la fonction goroutine qui est sujette aux paniques. Dans votre exemple, il pourrait s'agir de queue.ConsumeAndDoSomething() ou api.StartServer().
  2. Créer une goroutine de récupération : Créez une goroutine distincte pour gérer la logique de récupération. Dans cette goroutine, nous allons envelopper la fonction potentiellement panique dans une fonction defer.
  3. Gérer la récupération de panique : À l'intérieur de la fonction defer, appelez recovery() pour piéger toute panique pouvant survenir dans le fonction enveloppée. Si une panique est détectée, gérez-la de manière appropriée (par exemple, enregistrez l'erreur ou prenez des mesures correctives).

Voici une version mise à jour de votre extrait de code intégrant le mécanisme de récupération :

func main() {
    // Create a separate goroutine for recovery
    go func() {
        defer func() {
            if err := recover(); err != nil {
                log.Printf("Recovered: %v", err)
            }
        }()

        // Wrap the potentially panicking functions in deferred function
        go func() {
            defer recover()
            queue.ConsumeAndDoSomething()
        }()
        go func() {
            defer recover()
            api.StartServer()
        }()
    }()

    // Block indefinitely to keep the program running
    <-make(chan struct{})
}

En implémentant ce mécanisme de récupération, nous garantissons que l'exécution des autres goroutines ne sera pas affectée si une goroutine panique. Le programme continuera à s'exécuter et à gérer les paniques avec élégance, offrant ainsi un environnement d'exécution plus résilient.

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