Goroutine avec sélection de l'exécution de blocage
Lors de l'utilisation du modèle de concurrence Go, les Goroutines peuvent être utilisées pour effectuer des tâches asynchrones. Cependant, parfois, ces Goroutines peuvent entrer dans une boucle infinie, empêchant la progression du programme.
Étude de cas : Fonction Crawl
Dans l'exercice Go Tour #71, un La fonction d'exploration utilise Goroutines et une instruction select pour explorer un ensemble d'URL. Cependant, si une clause par défaut est incluse dans l'instruction select, la Goroutine devient bloquée et l'exécution s'arrête.
Comprendre Select
L'instruction select est une construction fondamentale dans Optez pour la gestion de la concurrence. Il permet à une goroutine d'attendre des données ou des événements sur plusieurs canaux. Sans clause par défaut, select bloquera indéfiniment jusqu'à ce qu'un message arrive sur l'un des canaux.
Impact de la clause par défaut
L'ajout d'une clause par défaut pour sélectionner modifie son comportement . Au lieu de bloquer, l'instruction par défaut s'exécutera immédiatement chaque fois qu'aucune donnée n'est disponible sur aucun des canaux. Dans la fonction crawl, ce comportement crée une boucle infinie.
Solution
Pour éviter la boucle infinie, on peut supprimer la clause par défaut de l'instruction select. Alternativement, on peut implémenter une instruction select non bloquante qui vérifie périodiquement les données disponibles sur les canaux.
Comportement du planificateur
Les goroutines sont planifiées de manière coopérative, ce qui signifie qu'elles doivent volontairement céder le contrôle au planificateur pour permettre à d'autres Goroutines de s'exécuter. Dans ce cas, la boucle infinie dans l'instruction select empêche le planificateur d'invoquer d'autres Goroutines, ce qui conduit à un comportement de blocage apparent.
Observations supplémentaires
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!