Un développeur a rencontré un problème déroutant où un programme continuait à se bloquer malgré le paramètre runtime.GOMAXPROCS(2) pour activer la simultanéité. Ce problème provient d'un malentendu courant en matière de concurrence : l'impact des boucles infinies sur l'exécution du programme.
Dans le code donné, deux goroutines sont générées : l'une exécutant une boucle infinie dans la fonction Forever() et l'autre imprimant des nombres. progressivement dans la fonction show(). Le paramètre GOMAXPROCS(2) spécifie que le programme doit utiliser deux cœurs de processeur pour exécuter les goroutines.
Cependant, le problème survient au sein de la fonction forever(). Les boucles infinies, comme celle de cette fonction, consomment l'intégralité d'un thread du système d'exploitation. Cela signifie que le thread s'exécute constamment sans céder, empêchant ainsi les autres goroutines de s'exécuter. Par conséquent, le programme semble se bloquer malgré l'utilisation de plusieurs cœurs de processeur.
Pour résoudre ce problème, il est crucial de supprimer les boucles infinies inutiles. Dans ce cas, la fonction Forever() ne sert à rien et peut être remplacée par une simple boucle for {} pour permettre à d'autres goroutines de planifier. Alternativement, un point de planification peut être inséré dans la boucle à l'aide de runtime.Gosched(), ce qui permet au planificateur d'exécution de préempter la goroutine et de donner à d'autres goroutines une chance de s'exécuter.
En éliminant les boucles infinies ou en introduisant des points de planification , le programme se comportera comme prévu et exploitera efficacement la concurrence. Cette compréhension souligne l'importance de concevoir soigneusement les interactions goroutine pour éviter les problèmes de performances et maintenir la réactivité du programme.
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!