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!