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.