Maison > Article > développement back-end > Compétences en programmation Golang à haute concurrence : compréhension approfondie de la stratégie de planification des Goroutines
Compétences en programmation à haute concurrence Golang : compréhension approfondie de la stratégie de planification de Goroutines
Introduction : Golang est un langage à haute concurrence et son thread léger intégré Goroutines est l'une de ses principales fonctionnalités de programmation simultanée. Cet article approfondira la stratégie de planification des Goroutines et comment optimiser les performances des programmes simultanés grâce à une utilisation raisonnable des stratégies de planification.
1. Stratégie de planification des Goroutines
Les Goroutines sont des threads légers de Golang Par rapport aux threads traditionnels du système d'exploitation, la planification des Goroutines est plus flexible et efficace. Golang utilise un composant appelé planificateur pour décider quelle Goroutine exécuter et quand. Dans Golang, nous n'avons généralement pas besoin de contrôler manuellement la planification des Goroutines, mais le planificateur le fait automatiquement.
La stratégie de planification des Goroutines comprend principalement trois aspects : la planification préemptive, la planification collaborative et le vol de travail.
Le planificateur de Golang adopte une stratégie de planification préemptive, c'est-à-dire que l'exécution de n'importe quelle Goroutine peut être interrompue par d'autres Goroutines à tout moment. L'avantage de cette stratégie de planification est qu'elle peut allouer raisonnablement les ressources CPU et empêcher un certain Goroutine de monopoliser le CPU pendant une longue période, empêchant d'autres Goroutines de s'exécuter. Lorsqu'un Goroutine est préempté, le planificateur enregistre son état et passe à d'autres Goroutines exécutables.
En plus de la planification préemptive, le planificateur de Golang adopte également une stratégie de planification collaborative. Dans la planification coopérative, Goroutine abandonnera automatiquement les droits d'exécution du CPU au lieu d'occuper le CPU tout le temps. En abandonnant activement le processeur au moment approprié et en basculant raisonnablement entre les Goroutines, les performances de concurrence de l'ensemble du système peuvent être améliorées.
Work Stealing est un mécanisme très important dans le planificateur Golang. Son idée principale est de permettre aux threads inactifs de « voler » activement des tâches à d'autres threads pour les exécuter, réalisant ainsi un équilibrage de charge entre les threads. Ce mécanisme peut éviter la situation dans laquelle certains threads fonctionnent trop tandis que d'autres restent inactifs, améliorant ainsi encore les performances des programmes simultanés.
2. Démonstration d'un exemple de stratégie de planification
Afin de mieux comprendre la stratégie de planification des Goroutines, examinons un exemple de code simple pour explorer l'impact des différentes stratégies de planification sur les programmes simultanés.
package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) // 设置只使用一个CPU核心 var wg sync.WaitGroup wg.Add(2) fmt.Println("Start Goroutines") // 第一个Goroutine go func() { defer wg.Done() for i := 0; i < 3; i++ { fmt.Println("Goroutine 1: ", i) } }() // 第二个Goroutine go func() { defer wg.Done() for i := 0; i < 3; i++ { fmt.Println("Goroutine 2: ", i) } }() fmt.Println("Waiting to finish") wg.Wait() fmt.Println("Terminating the program") }
Dans le code ci-dessus, nous définissons un seul cœur de processeur via runtime.GOMAXPROCS(1)
pour mieux observer les effets des différentes stratégies de planification. runtime.GOMAXPROCS(1)
设置只使用一个CPU核心,以便更好地观察不同调度策略的效果。
在运行示例代码时,我们可以观察到以下几种不同调度策略的效果:
通过不断调整runtime.GOMAXPROCS
Un seul Goroutine est en cours d'exécution. Dans ce cas, le Goroutine qui termine son exécution en premier libérera le CPU et exécutera d'autres Goroutines.
Deux Goroutines sont exécutés en alternance. Dans ce cas, comme il n’y a qu’un seul cœur de processeur, les Goroutines basculeront l’exécution entre eux.
runtime.GOMAXPROCS
et en observant le résultat du programme, nous pouvons avoir une compréhension plus approfondie de l'impact des différentes stratégies de planification sur les programmes simultanés. 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!