Heim >Backend-Entwicklung >Golang >Kann sich eine Aufruffunktion von Paniken in untergeordneten Goroutinen in Go erholen?
Wiederherstellung nach Kinder-Goroutine-Panik in Go
Während eines kürzlichen Programmierversuchs wurde eine grundlegende Annahme in Frage gestellt: die Fähigkeit eines Aufrufers, zu funktionieren Erholen Sie sich von der Panik der Kinder-Goroutinen. Entgegen der landläufigen Meinung, die etwas anderes vermuten lässt, wurde festgestellt, dass der verzögerte Wiederherstellungsmechanismus eines Aufrufers nicht in der Lage ist, die Beendigung des gesamten Programms zu verhindern, wenn eine untergeordnete Goroutine in Panik gerät.
Um dieses rätselhafte Verhalten zu veranschaulichen, betrachten Sie den folgenden Code:
<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>
Interessanterweise erweist sich der verzögerte Wiederherstellungsmechanismus in fun1 unabhängig davon, ob fun1 vor oder nach der Panik von fun2 abgeschlossen wird, als unwirksam, was zum sofortigen Abbruch des Programms führt.
Begründung dahinter Fehler
Die Go-Spezifikation bietet Klarheit über dieses unkonventionelle Verhalten:
Während der Ausführung einer Funktion F beendet ein expliziter Aufruf von Panic oder eine Laufzeitpanik die Ausführung von F. Beliebig Durch F verzögerte Funktionen werden dann wie gewohnt ausgeführt. Als nächstes werden alle verzögerten Funktionen ausgeführt, die vom F-Aufrufer ausgeführt werden, und so weiter, bis zu allen verzögerten Funktionen der obersten Ebene in der ausführenden Goroutine.An diesem Punkt wird das Programm beendet und die Fehlerbedingung wird gemeldet, einschließlich des Werts des Panic-Arguments.
In diesem Fall stellt fun2 die Funktion der obersten Ebene dar, die in ihrer jeweiligen Goroutine ausgeführt wird. Da fun2 über keinen Wiederherstellungsmechanismus verfügt, wird das Programm bei Auftreten einer Panik beendet und ignoriert alle verzögerten Wiederherstellungsversuche in fun1 oder seinen Vorgängern.
Dieses Verhalten unterstreicht einen entscheidenden Unterschied: Eine Goroutine kann sich nicht von einer Panik erholen, die ihren Ursprung in hat eine separate Goroutine. Folglich wird die verzögerte Wiederherstellung in fun1 zwecklos, da die Panik in fun2 die Goroutine und alle nachfolgenden Wiederherstellungsbemühungen effektiv beendet.
Das obige ist der detaillierte Inhalt vonKann sich eine Aufruffunktion von Paniken in untergeordneten Goroutinen in Go erholen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!