Maison > développement back-end > Golang > Pourquoi une instruction Go `select` a-t-elle besoin de `fmt.Print()` pour se terminer dans un Goroutine spécifique ?

Pourquoi une instruction Go `select` a-t-elle besoin de `fmt.Print()` pour se terminer dans un Goroutine spécifique ?

Susan Sarandon
Libérer: 2024-11-26 05:40:10
original
870 Les gens l'ont consulté

Why Does a Go `select` Statement Need `fmt.Print()` to Terminate in a Specific Goroutine?

goroute avec select ne se termine pas sans fmt.Print()

Dans l'exercice Go Tour #71, une goroute avec une instruction select s'exécute en continu sauf si une instruction fmt.Print() est ajoutée dans le cas par défaut. Ce comportement est dû au fonctionnement modifié de select lorsqu'une instruction par défaut est présente.

Sans valeur par défaut, select bloque jusqu'à ce qu'un message soit reçu sur l'un des canaux surveillés. En ajoutant une valeur par défaut, select exécute la branche par défaut chaque fois qu'aucun des canaux n'a de message.

Dans le code d'origine, l'instruction par défaut crée une boucle infinie :

for {
    select {
        case todo := <-toDoList:
            ...
        case <-doneCrawling:
            ...
        default:
            if os.Args[1] == "ok" {
                fmt.Print("")
            }
            if crawling == 0 {
                goto END
            }
        }
    }
Copier après la connexion

Sans le fmt. Print() par défaut, le planificateur ne peut pas planifier d'autres goroutines, ce qui entraîne un blocage. L'ajout de fmt.Print() permet au planificateur de continuer son fonctionnement normal, permettant ainsi l'achèvement de la goroutine.

Modifier le code pour utiliser une sélection non bloquante résout le problème :

for {
    select {
        case todo := <-toDoList:
            ...
        case <-doneCrawling:
            ...
    }
    if crawling == 0 {
        break
    }
}
Copier après la connexion

Alternativement, le code d'origine peut fonctionner en définissant GOMAXPROCS = 2, indiquant un problème avec un planificateur surchargé.

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