Maison > développement back-end > Golang > Go Deadlock : Pourquoi le « lancement : tous les goroutines sont endormis » se produit-il ?

Go Deadlock : Pourquoi le « lancement : tous les goroutines sont endormis » se produit-il ?

Mary-Kate Olsen
Libérer: 2025-01-02 15:03:39
original
535 Les gens l'ont consulté

Go Deadlock: Why Does

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

Dans un programme Go, une impasse se produit lorsque deux goroutines ou plus attendent pour que l'autre finisse, ce qui aboutit à un état gelé dans lequel aucun progrès ne peut être réalisé. Ce problème est souvent signalé comme "lancer : toutes les goroutines sont endormies - blocage !"

Analysons un programme Go simplifié pour comprendre pourquoi ce blocage se produit :

package main

import (
    "fmt"
)

func total(ch chan int) {
    res := 0
    for iter := range ch {
        res += iter
    }
    ch <- res
}

func main() {
    ch := make(chan int)
    go total(ch)
    ch <- 1
    ch <- 2
    ch <- 3
    fmt.Println("Total is ", <-ch)
}
Copier après la connexion

Dans ce programme, le La fonction total calcule la somme des nombres envoyés via le canal ch et renvoie le résultat sur le même canal. L'impasse survient parce que les conditions suivantes sont remplies :

  • Le total des blocs de fonctions à l'intérieur de la boucle for attend plus d'entrée via ch (avec le mot-clé range).
  • La fonction principale envoie trois valeurs à ch mais ne ferme pas le canal.
  • Comme la fonction total attend toujours plus d'entrée, elle ne renvoie pas le résultat sur ch.
  • La fonction principale se bloque sur la ligne fmt.Println en attendant le résultat de ch.

Cela crée une situation de blocage où les deux goroutines (celle du total cumulé et celle en principal) attendent que l'autre agisse, conduisant à l'erreur "lancer : toutes les goroutines sont endormies".

Pour résoudre cette impasse, nous pouvons fermer le canal ch dans la fonction principale après l'envoi de la dernière valeur :

ch <- 3
close(ch)
Copier après la connexion

La fermeture du canal signale à la goroutine totale qu'il n'y a plus d'entrée, lui permettant de terminer son calcul et de renvoyer le résultat sur ch .

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!

source:php.cn
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