Comment peut-on lancer et gérer efficacement un grand nombre de goroutines, par exemple, environ 100 000 ?
sobes.tech IA
Réponse de l'IA
Pour lancer et gérer efficacement environ 100 000 goroutines en Go, il est important de prendre en compte plusieurs aspects:
-
Utilisation d'un pool de workers — au lieu de lancer toutes les goroutines en même temps, créez un pool de taille fixe (par exemple, quelques centaines) et répartissez les tâches entre eux. Cela réduit la charge sur le planificateur et diminue la consommation de mémoire.
-
Contrôle des ressources — les goroutines sont légères, mais chacune utilise une pile (par défaut, plusieurs kilo-octets), il est donc important d'éviter de lancer trop de goroutines simultanément sans contrôle.
-
Utilisation de canaux pour la synchronisation — pour gérer le cycle de vie des goroutines et le transfert de données entre elles.
-
Contexte (context.Context) — pour les annulations et les délais d'attente.
Exemple d'un simple pool de workers:
package main
import (
"fmt"
"sync"
)
func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
for j := range jobs {
// Traitement de la tâche
results <- j * 2
}
}
func main() {
const numJobs = 100000
const numWorkers = 100
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
var wg sync.WaitGroup
for w := 1; w <= numWorkers; w++ {
wg.Add(1)
go worker(w, jobs, results, &wg)
}
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
wg.Wait()
close(results)
// Traitement des résultats
count := 0
for r := range results {
_ = r // utiliser le résultat
count++
}
fmt.Println("Tâches traitées:", count)
}
Cette approche permet de gérer efficacement un grand nombre de tâches avec un nombre limité de goroutines.