Maison >développement back-end >Golang >Une fonction d'appelant peut-elle se remettre des paniques dans les goroutines enfants dans Go ?

Une fonction d'appelant peut-elle se remettre des paniques dans les goroutines enfants dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-29 08:41:30448parcourir

Can a Caller Function Recover from Panics in Child Goroutines in Go?

Récupération des paniques de Child Goroutine dans Go

Au cours d'un récent projet de programmation, une hypothèse fondamentale a été remise en question : la capacité d'une fonction d'appelant à se remettre des paniques des enfants goroutines. Malgré les idées reçues suggérant le contraire, il a été découvert que le mécanisme de récupération différée d'un appelant ne parvient pas à empêcher la fin de l'ensemble du programme lorsqu'une goroutine enfant est victime de panique.

Pour illustrer ce comportement déroutant, considérons le code suivant :

<code class="go">func fun1() {
    fmt.Println("fun1 started")
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recover in func1")
        }
    }()

    go fun2()

    time.Sleep(10 * time.Second) // wait for the boom!
    fmt.Println("fun1 ended")
}

func fun2() {
    fmt.Println("fun2 started")

    time.Sleep(5 * time.Second)
    panic("fun2 booom!")

    fmt.Println("fun2 ended")
}</code>

Curieusement, que fun1 se termine avant ou après la panique de fun2, le mécanisme de récupération différée de fun1 s'avère inefficace, conduisant à la disparition immédiate du programme.

Raisonnement derrière le Échec

La spécification Go apporte des éclaircissements sur ce comportement non conventionnel :

Lors de l'exécution d'une fonction F, un appel explicite à la panique ou une panique à l'exécution met fin à l'exécution de F. Tout les fonctions différées par F sont ensuite exécutées comme d'habitude. Ensuite, toutes les fonctions différées exécutées par l'appelant de F sont exécutées, et ainsi de suite jusqu'à celles différées par la fonction de niveau supérieur dans la goroutine en cours d'exécution. À ce stade, le programme se termine et la condition d'erreur est signalée, y compris la valeur de l'argument de panique.

Dans ce cas, fun2 représente la fonction de niveau supérieur s'exécutant dans sa goroutine respective. Comme fun2 ne dispose pas d'un mécanisme de récupération, le programme se termine lors de sa panique, sans tenir compte de toute tentative de récupération différée dans fun1 ou ses prédécesseurs.

Ce comportement souligne une distinction cruciale : une goroutine ne peut pas se remettre d'une panique provenant de une goroutine séparée. Par conséquent, la récupération différée dans fun1 devient futile, car la panique dans fun2 met effectivement fin à la goroutine et à tous les efforts de récupération ultérieurs.

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