Sobes.tech
Junior — Middle

Este posibilă stabilirea unui limit pentru numărul de fire de execuție care rulează simultan în limbajul Go?

sobes.tech AI

Răspuns de la AI

În Go, nu există un mecanism încorporat pentru a limita direct numărul de goroutines (fir de execuție ușor) care rulează simultan. Pot exista multe goroutines, și sunt ușoare. Pentru a limita numărul de goroutines care rulează în același timp, se folosesc de obicei semafoare sau canale cu capacitate limitată.

Exemplu de limitare a numărului de goroutines care rulează simultan folosind un canal:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // Rezervă un slot
    fmt.Printf("Worker %d a început\n", id)
    time.Sleep(time.Second) // Lucru
    fmt.Printf("Worker %d a terminat\n", id)
    <-sem // Eliberează slotul
}

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

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

    wg.Wait()
}

Aici, canalul sem cu un buffer de maxConcurrent limitează numărul de goroutines care rulează în același timp la 3.