Maison > développement back-end > Golang > Go Deadlocks : Comment éviter l'erreur « Tous les goroutines sont endormis » ?

Go Deadlocks : Comment éviter l'erreur « Tous les goroutines sont endormis » ?

Linda Hamilton
Libérer: 2024-12-27 13:06:18
original
912 Les gens l'ont consulté

Go Deadlocks: How to Avoid the

Impression dans Go : "lancer : toutes les goroutines sont endormies"

Une impasse de goroutine se produit lorsque toutes les goroutines en cours d'exécution s'attendent les unes les autres pour complet. Dans le code Go fourni, une impasse survient en raison du canal ch non fermé.

La fonction totale attend en permanence de nouvelles valeurs sur le canal ch à l'aide d'une boucle de plage. Puisque le canal ch n'est jamais fermé, la boucle ne se terminera jamais. Cela signifie que la goroutine chargée d'exécuter cette fonction ne terminera jamais.

Pendant ce temps, dans la fonction principale, le programme tente d'envoyer des valeurs au canal ch et de recevoir le résultat. Cependant, comme le goroutine total attend indéfiniment, il ne peut pas traiter les valeurs envoyées et renvoyer le résultat. Cela provoque un blocage du programme.

Pour résoudre ce blocage, le canal ch doit être fermé après l'envoi de toutes les valeurs. Cela signalera à la fonction totale d'arrêter d'attendre de nouvelles valeurs et de calculer le résultat.

Voici une version modifiée du code avec la fermeture du canal :

package main

import (
    "fmt"
)

func total(in chan int, out chan int) {
    res := 0
    for iter := range in {
        res += iter
    }
    out <- res // sends back the result
}

func main() {
    ch := make(chan int)
    rch := make(chan int)
    go total(ch, rch)
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch) // this will end the loop in the total function
    result := <-rch // waits for total to give the result
    fmt.Println("Total is ", result)
}
Copier après la connexion

Maintenant, le total cumulé de la goroutine effectuera correctement la sommation et renverra le résultat à main, évitant ainsi une impasse.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal