Threading Goroutines dans Go : exécuter simultanément un nombre constant
Le domaine de la concurrence Go offre une pléthore de documents sur l'attente de l'achèvement d'un nombre spécifié de goroutines. Cependant, un défi distinct se présente : assurer l'exécution continue d'un nombre prédéfini de goroutines, l'une commençant alors qu'une autre se termine.
Considérons un scénario avec une quantité importante de tâches, comme le traitement de données récupérées à partir d'un MySQL. base de données. Une approche naïve pourrait lancer un grand nombre de goroutines parallèles, exécutant simultanément des centaines de milliers de tâches. En revanche, le comportement souhaité limite le nombre de goroutines exécutées simultanément à un nombre fixe (disons 20).
Ce modèle de concurrence contrôlée est connu sous le nom de « parallélisme limité ». L'implémentation de ce modèle dans Go implique d'utiliser un canal de structures vides comme sémaphore, dictant le nombre maximum de goroutines de travail simultanées. Voici une illustration :
package main import "fmt" func main() { maxGoroutines := 10 guard := make(chan struct{}, maxGoroutines) for i := 0; i < 30; i++ { guard <- struct{}{} // blocks if guard channel is full go func(n int) { worker(n) <-guard // unlocks a slot in guard }(i) } } func worker(i int) { fmt.Println("doing work on", i) }
Cette implémentation garantit que pas plus que le nombre spécifié de goroutines ne s'exécutent simultanément. Par conséquent, lorsqu'une goroutine de travail se termine, une nouvelle goroutine est immédiatement lancée, maintenant le niveau de concurrence souhaité.
L'article « Go Concurrency Patterns » explore plus en détail ce concept dans sa section « Parallélisme limité », fournissant des informations plus approfondies. un aperçu de cette technique de concurrence cruciale.
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!