Maison  >  Article  >  développement back-end  >  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
Susan Sarandonoriginal
2024-11-26 05:40:10808parcourir

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
            }
        }
    }

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
    }
}

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!

Déclaration:
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