Se bloquer après avoir défini GOMAXPROCS(2)
Vous avez configuré le programme pour autoriser deux threads simultanés à l'aide de runtime.GOMAXPROCS(2). Cependant, le programme rencontre toujours un blocage lors de la sortie des nombres, même si l'utilisation du processeur est élevée.
Le problème survient en raison de la présence d'une boucle occupée dans la fonction Forever(). Une boucle occupée s'exécute en continu sans céder le contrôle au planificateur. Dans ce cas, la fonction Forever() consomme effectivement indéfiniment l'un des threads disponibles.
Ce comportement interfère avec la capacité du planificateur à allouer le thread restant à la fonction show(), c'est pourquoi le programme semble accrocher. La fonction show() introduit également une inefficacité en dormant pendant 1 000 millisecondes entre les itérations.
Solution
Pour résoudre ce problème, vous devez supprimer la boucle occupée du fichier Forever. () et implémentez un point de planification dans la fonction show(). Un point de planification permet au planificateur de reprendre le contrôle périodiquement, garantissant que toutes les goroutines ont la possibilité de s'exécuter.
Voici le code modifié :
func forever() { for { runtime.Gosched() } } func show() { for number := 1; number < 999999; number++ { time.Sleep(1000) runtime.Gosched() fmt.Println(number) } }
En ajoutant runtime.Gosched() à la fin de la boucle for dans la fonction show(), vous pouvez éliminer le problème et permettre au programme de fonctionner correctement.
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!