Sobes.tech
Junior — Middle

Est-il possible de fixer une limite au nombre de threads fonctionnant simultanément dans le langage Go?

sobes.tech IA

Réponse de l'IA

En Go, il n’existe pas de mécanisme intégré pour limiter directement le nombre de goroutines (fils d’exécution) fonctionnant simultanément. Il peut y avoir beaucoup de goroutines, et elles sont légères. Pour limiter le nombre de goroutines en cours d’exécution en même temps, on utilise généralement des sémaphores ou des canaux avec une capacité limitée.

Exemple de limitation du nombre de goroutines en cours d’exécution simultanément à l’aide d’un canal :

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // Réserver une place
    fmt.Printf("Travailleur %d démarré\n", id)
    time.Sleep(time.Second) // Travail
    fmt.Printf("Travailleur %d terminé\n", id)
    <-sem // Libérer une place
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent) // Canal avec limite
    var wg sync.WaitGroup

    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go worker(i, sem, &wg)
    }

    wg.Wait()
}

Ici, le canal sem avec un tampon de maxConcurrent limite le nombre de goroutines en cours d’exécution à 3.