Maison >développement back-end >Golang >Comment la fonction « recover() » de Go peut-elle assurer la persistance de Goroutine face aux crashs ?
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() }
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") } }
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!